У меня есть ссылка, такая как http://www.techcrunch.com/, и я хочу получить только techcrunch.com часть ссылки. Как мне это сделать в питоне?
Получить корневой домен ссылки
Ответы (8)
Получить имя хоста достаточно просто, используя urlparse:
hostname = urlparse.urlparse("http://www.techcrunch.com/").hostname
Однако получение «корневого домена» будет более проблематичным, поскольку он не определен в синтаксическом смысле. Что такое корневой домен «www.theregister.co.uk»? Как насчет сетей, использующих домены по умолчанию? "devbox12" может быть допустимым именем хоста.
Одним из способов решения этой проблемы может быть использование общедоступного списка суффиксов, который пытается каталогизировать оба реальных домена верхнего уровня (например, ".com", ".net", ".org"), а также частные домены, которые используются как TLD (например, ".co.uk" или даже ".github.io"). Вы можете получить доступ к PSL из Python, используя библиотеку publicsuffix2:
import publicsuffix
import urlparse
def get_base_domain(url):
# This causes an HTTP request; if your script is running more than,
# say, once a day, you'd want to cache it yourself. Make sure you
# update frequently, though!
psl = publicsuffix.fetch()
hostname = urlparse.urlparse(url).hostname
return publicsuffix.get_public_suffix(hostname, psl)
hostname[-2] означает предпоследнюю запись (в данном случае имя хоста, разделенное точками). foo and bar or baz работает так же, как троичный: если foo истинно, return bar; в противном случае вернуть базу. Наконец, hostname[-3:] означает последние три части. Все вместе это означает, что если предпоследняя часть имени хоста короче четырех символов, используйте последние три части и соедините их точками. В противном случае возьмите только две последние части и соедините их вместе.
- person Ben Blank; 24.08.2017
ImportError: cannot import name 'get_public_suffix'. Не удалось найти ответ в Интернете или в документации, поэтому вместо этого просто использовал tldextract, который просто работает! Конечно, я должен был sudo pip3 install tldextract сначала.
- person Nagev; 02.02.2018
Общая структура URL:
схема://netloc/путь;параметры?запрос#фрагмент
Девиз TIMTOWTDI:
Используя urlparse,
>>> from urllib.parse import urlparse # python 3.x
>>> parsed_uri = urlparse('http://www.stackoverflow.com/questions/41899120/whatever') # returns six components
>>> domain = '{uri.netloc}/'.format(uri=parsed_uri)
>>> result = domain.replace('www.', '') # as per your case
>>> print(result)
'stackoverflow.com/'
Используя tldextract,
>>> import tldextract # The module looks up TLDs in the Public Suffix List, mantained by Mozilla volunteers
>>> tldextract.extract('http://forums.news.cnn.com/')
ExtractResult(subdomain='forums.news', domain='cnn', suffix='com')
в твоем случае:
>>> extracted = tldextract.extract('http://www.techcrunch.com/')
>>> '{}.{}'.format(extracted.domain, extracted.suffix)
'techcrunch.com'
tldextract, с другой стороны, знает, как выглядят все рДВУ [Общие домены верхнего уровня] и нДВУ [Домены верхнего уровня с кодом страны], просматривая действующие в настоящее время в соответствии с в список общедоступных суффиксов. Таким образом, имея URL-адрес, он узнает свой субдомен по своему домену и свой домен по коду своей страны.
Привет! :)
Следующий сценарий не идеален, но его можно использовать для отображения/сокращения. Если вы действительно хотите/должны избегать каких-либо сторонних зависимостей, особенно удаленного извлечения и кэширования некоторых данных tld, я могу предложить вам следующий сценарий, который я использую в своих проектах. Он использует последние две части домена для наиболее распространенных расширений домена и оставляет последние три части для остальных менее известных расширений домена. В худшем случае домен будет состоять из трех частей вместо двух:
from urlparse import urlparse
def extract_domain(url):
parsed_domain = urlparse(url)
domain = parsed_domain.netloc or parsed_domain.path # Just in case, for urls without scheme
domain_parts = domain.split('.')
if len(domain_parts) > 2:
return '.'.join(domain_parts[-(2 if domain_parts[-1] in {
'com', 'net', 'org', 'io', 'ly', 'me', 'sh', 'fm', 'us'} else 3):])
return domain
extract_domain('google.com') # google.com
extract_domain('www.google.com') # google.com
extract_domain('sub.sub2.google.com') # google.com
extract_domain('google.co.uk') # google.co.uk
extract_domain('sub.google.co.uk') # google.co.uk
extract_domain('www.google.com') # google.com
extract_domain('sub.sub2.voila.fr') # sub2.voila.fr
______Использование Python 3.3, а не 2.x________
Я хотел бы добавить небольшую вещь к ответу Бена Бланка.
from urllib.parse import quote,unquote,urlparse
u=unquote(u) #u= URL e.g. http://twitter.co.uk/hello/there
g=urlparse(u)
u=g.netloc
К настоящему времени я только что получил доменное имя из urlparse.
Чтобы удалить субдомены, вам прежде всего нужно знать, какие из них являются доменами верхнего уровня, а какие нет. Например. в приведенном выше http://twitter.co.uk - co.uk является ДВУ, тогда как в http://sub.twitter.com у нас есть только .com в качестве ДВУ, а sub является поддоменом.
Итак, нам нужно получить файл/список, в котором есть все tld.
tlds = load_file("tlds.txt") #tlds holds the list of tlds
hostname = u.split(".")
if len(hostname)>2:
if hostname[-2].upper() in tlds:
hostname=".".join(hostname[-3:])
else:
hostname=".".join(hostname[-2:])
else:
hostname=".".join(hostname[-2:])
Вам не нужен пакет или какие-либо сложности, которые люди предлагают для этого, это так же просто, как показано ниже, и настраивается по вашему вкусу.
def is_root(url):
head, sep, tail = url.partition('//')
is_root_domain = tail.split('/', 1)[0] if '/' in tail else url
# printing or returning is_root_domain will give you what you seek
print(is_root_domain)
is_root('http://www.techcrunch.com/')
Это сработало для меня:
def get_sub_domains(url):
urlp = parseurl(url)
urlsplit = urlp.netloc.split(".")
l = []
if len(urlsplit) < 3: return l
for item in urlsplit:
urlsplit = urlsplit[1:]
l.append(".".join(urlsplit))
if len(urlsplit) < 3:
return l
Мы можем получить практически любое доменное имя, используя этот простой метод разделения.
url = 'https://www.google.com'
if '//' in url:
root_domain = url.split('//')[1].split('/')[0]
print(root_domain) # 'www.google.com'
else:
root_domain = url.split('/')[0]
print(root_domain) # 'www.google.com'
Это сработало для моих целей. Я решил, что поделюсь.
".".join("www.sun.google.com".split(".")[-2:])