在 Python 中从 URL 中提取域名
Posted
技术标签:
【中文标题】在 Python 中从 URL 中提取域名【英文标题】:Extract domain name from URL in Python 【发布时间】:2017-10-16 17:43:42 【问题描述】:我正在尝试从 URL 列表中提取域名。就像在
https://***.com/questions/18331948/extract-domain-name-from-the-url
我的问题是 URL 可以是关于一切的,几个例子:m.google.com
=> google
m.docs.google.com
=> google
www.someisotericdomain.innersite.mall.co.uk
=> mall
www.ouruniversity.department.mit.ac.us
=> mit
www.somestrangeurl.shops.relevantdomain.net
=> relevantdomain
www.example.info
=> example
等等..
域的多样性不允许我使用how to get domain name from URL 中所示的正则表达式(因为我的脚本将在来自真实网络流量的大量 url 上运行,所以正则表达式必须很大才能捕获所有类型如上所述的域)。
不幸的是,我的网络研究没有提供任何有效的解决方案。
有没有人知道如何做到这一点?
任何帮助将不胜感激 !
谢谢
【问题讨论】:
你可以使用外部库吗? 收集***域列表,用点分割您的网址,从 TLD 中删除您的网址,提取名称。 how to get domain name from URL的可能重复 是的,我可以使用外部库。这不是重复(我什至附上了这个帖子的链接),我在那里找不到令人满意的答案。 使用urllib.parse
【参考方案1】:
看来你可以对那个url使用urlparse https://docs.python.org/3/library/urllib.parse.html,然后提取netloc。
您可以通过使用 split 轻松地从 netloc 中提取域名
【讨论】:
感谢您的回复,不幸的是,在m.city.domain.com
这样的 url 上使用 urlparse 返回了我 ParseResult(scheme='', netloc='', path='m.city.domain.com', params='', query='', fragment='')
,而预期的输出是 domain
使用有效的 URL (//m.city.domain.com/),而不是 (m.city.domain.com)。没有人能猜到你删除反斜杠时传递了什么。【参考方案2】:
使用正则表达式,您可以使用如下内容:
(?<=\.)([^.]+)(?:\.(?:co\.uk|ac\.us|[^.]+(?:$|\n)))
https://regex101.com/r/WQXFy6/5
注意,您必须注意特殊情况,例如 co.uk
。
【讨论】:
【参考方案3】:使用tldextract
是urlparse
的更高效版本,tldextract
准确地将gTLD
或ccTLD
(通用或国家代码***域)与注册的domain
和subdomains
区分开来一个网址。
>>> import tldextract
>>> ext = tldextract.extract('http://forums.news.cnn.com/')
ExtractResult(subdomain='forums.news', domain='cnn', suffix='com')
>>> ext.domain
'cnn'
【讨论】:
注意:tldextract
库在初始安装时发出 http 请求并创建最新 tld 数据的缓存。这可能会引发某些远程部署的权限错误。见这里:github.com/john-kurkowski/tldextract#note-about-caching【参考方案4】:
通过正则表达式的简单解决方案
import re
def domain_name(url):
return url.split("www.")[-1].split("//")[-1].split(".")[0]
【讨论】:
获取域的第一部分,而不是实际域。仅适用于 www.google.com 之类的内容 不可靠的解决方案,避免。以上是关于在 Python 中从 URL 中提取域名的主要内容,如果未能解决你的问题,请参考以下文章