Tôi có một liên kết như http://www.techcrunch.com/ và tôi muốn chỉ nhận phần techcrunch.com của liên kết. Làm thế nào để tôi đi về điều này trong python?Lấy tên miền gốc của liên kết
Trả lời
Bắt tên máy là dễ dàng, đủ sử dụng urlparse:
hostname = urlparse.urlparse("http://www.techcrunch.com/").hostname
Lấy "tên miền gốc", tuy nhiên, sẽ là vấn đề nhiều hơn, bởi vì nó không được định nghĩa trong một cảm giác cú pháp. Tên miền gốc của "www.theregister.co.uk" là gì? Làm thế nào về mạng sử dụng tên miền mặc định? "devbox12" có thể là tên máy chủ hợp lệ.
Một cách để xử lý việc này là sử dụng Public Suffix List, cố gắng liệt kê cả hai tên miền cấp cao nhất thực tế (ví dụ: ".com", ".net", ".org") cũng như các miền riêng tư là đã sử dụng như TLD (ví dụ: ".co.uk" hoặc thậm chí ".github.io"). Bạn có thể truy cập PSL từ Python bằng cách sử dụng thư viện 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)
Bạn có thể giải thích cách mã này hostname = ".". join (len (tên máy chủ [-2]) <4 và tên máy chủ [-3:] hoặc tên máy chủ [-2:]) hoạt động? Cảm ơn – Joozty
@ Joozty - Chỉ số tiêu cực bắt đầu từ cuối, vì vậy 'tên máy chủ [-2]' có nghĩa là mục nhập từ tiếp theo đến cuối cùng (trong trường hợp này, tên máy chủ được phân tách bằng dấu chấm). 'foo và bar hoặc baz' hoạt động giống như một ternary: nếu" foo "là true, trả về" bar "; nếu không, hãy trả lại "baz". Cuối cùng, 'hostname [-3:]' có nghĩa là ba phần cuối cùng. Tất cả cùng nhau, điều này có nghĩa là "Nếu phần tiếp theo của tên máy chủ ngắn hơn bốn ký tự, hãy sử dụng ba phần cuối cùng và nối chúng lại với nhau bằng dấu chấm. Nếu không, chỉ lấy hai phần cuối cùng và nối chúng lại với nhau." –
Vì lý do nào đó, ngay cả sau khi cài đặt mô-đun, trên Python 3 tôi nhận được 'ImportError: không thể nhập tên 'get_public_suffix''. Không thể tìm thấy bất kỳ câu trả lời trực tuyến hoặc trong tài liệu, vì vậy chỉ cần sử dụng "tldextract" thay thế mà chỉ hoạt động! Tất nhiên, tôi đã phải 'sudo pip3 cài đặt tldextract' đầu tiên. – Nagev
Điều này làm việc cho mục đích của tôi. Tôi nghĩ tôi sẽ chia sẻ nó.
".".join("www.sun.google.com".split(".")[-2:])
Cách thử nghiệm "www.sun.google.co.uk"? Bạn sẽ nhận được "co.uk" thay vì "google.co.uk" ... Chúc mừng! –
Ya, sử dụng cách tiếp cận của Ben Blank. Không chắc chắn những gì tôi đã suy nghĩ (trong năm 2010) :-) –
______Using Python 3.3 và không 2.x ________
Tôi muốn nói thêm một điều nhỏ để trả lời Ben Blank.
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
Hiện tại, tôi chỉ có tên miền từ urlparse.
Để loại bỏ các tên miền phụ bạn trước hết cần biết đó là Tên miền cấp cao nhất và những miền nào không. Ví dụ. ở trên http://twitter.co.uk
- co.uk
là TLD trong khi ở http://sub.twitter.com
chúng tôi chỉ có .com
là TLD và sub
là tên miền phụ.
Vì vậy, chúng tôi cần nhận tệp/danh sách có tất cả các tlds.
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:])
cấu trúc chung của URL:
scheme://netloc/path;parameters?query#fragment
Như TIMTOWTDI phương châm:
Sử dụng 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/'
Sử dụng 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')
trong trường hợp của bạn:
>>> extracted = tldextract.extract('http://www.techcrunch.com/')
>>> '{}.{}'.format(extracted.domain, extracted.suffix)
'techcrunch.com'
tldextract
on the other hand knows what all gTLDs [Generic Top-Level Domains] and ccTLDs [Country Code Top-Level Domains] look like by looking up the currently living ones according to the Public Suffix List. So, given a URL, it knows its subdomain from its domain, and its domain from its country code.
Cheerio!:)
Kịch bản sau không hoàn hảo, nhưng có thể được sử dụng cho mục đích hiển thị/rút ngắn. Nếu bạn thực sự muốn/cần phải tránh bất kỳ phụ thuộc bên thứ 3 - đặc biệt là từ xa lấy và bộ nhớ đệm một số dữ liệu tld tôi có thể đề nghị bạn theo kịch bản mà tôi sử dụng trong các dự án của tôi. Nó sử dụng hai phần cuối của miền cho phần mở rộng tên miền phổ biến nhất và để lại ba phần cuối cùng cho phần còn lại của các phần mở rộng tên miền ít được biết đến. Trong trường hợp xấu nhất kịch bản miền sẽ có ba phần thay vì hai:
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
def get_domain(url):
u = urlsplit(url)
return u.netloc
def get_top_domain(url):
u"""
>>> get_top_domain('http://www.google.com')
'google.com'
>>> get_top_domain('http://www.sina.com.cn')
'sina.com.cn'
>>> get_top_domain('http://bbc.co.uk')
'bbc.co.uk'
>>> get_top_domain('http://mail.cs.buaa.edu.cn')
'buaa.edu.cn'
"""
domain = get_domain(url)
domain_parts = domain.split('.')
if len(domain_parts) < 2:
return domain
top_domain_parts = 2
# if a domain's last part is 2 letter long, it must be country name
if len(domain_parts[-1]) == 2:
if domain_parts[-1] in ['uk', 'jp']:
if domain_parts[-2] in ['co', 'ac', 'me', 'gov', 'org', 'net']:
top_domain_parts = 3
else:
if domain_parts[-2] in ['com', 'org', 'net', 'edu', 'gov']:
top_domain_parts = 3
return '.'.join(domain_parts[-top_domain_parts:])
Điều này có thể làm các trick. http://docs.python.org/library/urlparse.html – Eli