【问题标题】:Extract domain from URL in python [duplicate]从python中的URL中提取域[重复]
【发布时间】:2017-10-22 03:20:16
【问题描述】:

我有一个类似的网址:
http://abc.hostname.com/somethings/anything/

我想得到:
hostname.com

我可以使用什么模块来完成这项工作?
我想在python2中使用相同的模块和方法。

【问题讨论】:

  • 我想你可以使用正则表达式。
  • 你可以使用str.split(),很简单
  • url.split('/')[2] 将为您提供 'abc.hostname.com' 您可以使用 split 或 re 任何方法提取它。

标签: python url


【解决方案1】:

假设您将它放在一个可访问的字符串中,并假设我们想要通用以在顶级域上拥有多个级别,您可以:

token=my_string.split('http://')[1].split('/')[0]
top_level=token.split('.')[-2]+'.'+token.split('.')[-1]

我们首先用http:// 分割以从字符串中删除它。然后我们用/ 分割以删除字符串的所有目录或子目录部分,然后[-2] 意味着我们在. 之后取倒数第二个标记,并将它附加到最后一个标记,给出我们是顶级域名。

可能有更优雅和健壮的方法可以做到这一点,例如,如果您的网站是http://.com,它会崩溃,但它是一个开始:)

【讨论】:

  • 您的代码可以简化更多 token=my_string.split('/')[2] 尽管它也适用于 ftp:// 和 https:// 。
  • 这是有效的反馈:)
【解决方案2】:

可以使用python的urlparse代替正则表达式或手写解决方案

from urllib.parse import urlparse

print(urlparse('http://abc.hostname.com/somethings/anything/'))
>> ParseResult(scheme='http', netloc='abc.hostname.com', path='/somethings/anything/', params='', query='', fragment='')

print(urlparse('http://abc.hostname.com/somethings/anything/').netloc)
>> abc.hostname.com

没有子域

t = urlparse('http://abc.hostname.com/somethings/anything/').netloc
print ('.'.join(t.split('.')[-2:]))
>> hostname.com

【讨论】:

  • 在 Python3 中,库 urlparse 被重命名为 urllib.parse
  • 它可以与 test.mytest.example.com 之类的东西一起使用吗?
  • @qasimzee 它不会,它会从第一个 . 开始获取所有内容
【解决方案3】:

试试:

from urlparse import urlparse

parsed = urlparse('http://abc.hostname.com/somethings/anything/')
domain = parsed.netloc.split(".")[-2:]
host = ".".join(domain)
print host  # will prints hostname.com

【讨论】:

  • 不适用于 .co.uk
【解决方案4】:

您可以使用tldextract

示例代码:

from tldextract import extract
tsd, td, tsu = extract("http://abc.hostname.com/somethings/anything/") # prints abc, hostname, com
url = td + '.' + tsu # will prints as hostname.com    
print(url)

【讨论】:

  • tldextract 不是标准库(至少在 python 2.7 中不是),我认为您应该提到这一点。还是 +1
  • 效果很好!但是,无法找到记录器“tldextract”的处理程序,如何处理。
【解决方案5】:

我找到的最好方法是:

from six.moves.urllib.parse import urlparse

t = urlparse('http://asas.abc.hostname.com/somethings/anything/').netloc

print('.'.join(t.split('.')[-2:]))

【讨论】:

  • 是的,但是“最好”如何?还有其他四个答案,为什么这个应该被接受?
  • 这也适用于以下域:asas.abc.hostname.com twest.asas.abc.hostname.com,您只能获得域的根目录。
  • 那不灵活..它无法获取以 .co.uk、com.br 结尾的每个域,例如..
【解决方案6】:

对于在 Python 3 中解析 URL 的域,您可以使用:

from urllib.parse import urlparse

domain = urlparse('http://www.example.test/foo/bar').netloc
print(domain) # --> www.example.test

但是,为了可靠地解析顶级域(本例中为 example.test),您需要安装专门的库(例如,tldextract)。

【讨论】:

    猜你喜欢
    • 2011-02-01
    • 2017-12-14
    • 2015-08-03
    • 1970-01-01
    • 2017-10-16
    • 1970-01-01
    • 2015-03-08
    • 2011-05-06
    • 2021-04-12
    相关资源
    最近更新 更多