1

我正在使用 python 并尝试获取 url 的特定部分,如下所示

from urlparse import urlparse as ue

url = "https://www.google.co.in"
img_url = ue(url).hostname

结果

www.google.co.in

案例1

实际上我会有一些 url(存储在列表或其他地方),所以我想要的是,需要domain name在 url 中找到上面的内容并获取之后www.和之前的部分.co.in,即字符串在之后first dot和之前开始second dot这只会google导致目前的情况。

因此,假设给出的 url 是 url given is www.gmail.com,我应该只gmail在其中获取,所以无论给出的 url 是什么,代码都应该获取以第一个点开头和第二个点之前的部分。

案例2:

也可以像这样直接给出一些 url ,domain.com, stackoverflow.com而不www在 url 中,在这种情况下,它应该只获取stackoverflowand domain

最后,我的意图是从这样的 url 中获取主名称gmail, stackoverflow, google.....

一般来说,如果我有一个 url,我可以使用list slicing并获取字符串,但我会有许多 ulr,所以需要像上面提到的那样动态获取想要的部分

谁能让我知道如何满足上述概念?

4

3 回答 3

2

为什么你不能这样做:

from urlparse import urlparse as ue
urls = ['https://www.google.com', 'http://stackoverflow.com']
parsed = []
for url in urls:
    decoded = ue(url).hostname
    if decoded.startswith('www.'):
        decoded = ".".join(decoded.split('.')[1:])
    parsed.append(decoded.split('.')[0])
#parsed is now your parsed list of hostnames

此外,您可能希望更改 for 循环中的 if 语句,因为某些域可能以您想要摆脱的其他事物开头。

于 2013-02-22T05:31:05.400 回答
1

使用一组预定义的顶级域怎么样?

import re
from urlparse import urlparse

#Fake top level domains... EG: co.uk, co.in, co.cc
TOPLEVEL = [".co.[a-zA-Z]+", ".fake.[a-zA-Z]+"]

def TLD(rgx, host, max=4): #4 = co.name
        match = re.findall("(%s)" % rgx, host, re.IGNORECASE)
        if match: 
            if len(match[0].split(".")[1])<=max:
                return match[0]
        else:
            return False

parsed = []
urls = ["http://www.mywebsite.xxx.asd.com", "http://www.dd.test.fake.uk/asd"]
for url in urls:
    o = urlparse(url)
    h = o.hostname
    for j in range(len(TOPLEVEL)):
        TL = TLD(TOPLEVEL[j], h)
        if TL: 
            name = h.replace(TL, "").split(".")[-1]
            parsed.append(name)
            break
        elif(j+1==len(TOPLEVEL)): 
            parsed.append(h.split(".")[-2])
            break

print parsed

这有点 hacky,对某些人来说可能很神秘,但它确实有效,并且无需再做任何事情 :)

于 2013-02-22T06:14:43.677 回答
0

这是我的解决方案,最后,包含您期望的域列表。

import urlparse
urls = [
    'https://www.google.com', 
    'http://stackoverflow.com',
    'http://www.google.co.in',
    'http://domain.com',
    ]
hostnames = [urlparse.urlparse(url).hostname for url in urls]
hostparts = [hostname.split('.') for hostname in hostnames]
domains = [p[0] == 'www' and p[1] or p[0] for p in hostparts]
print domains # ==> ['google', 'stackoverflow', 'google', 'domain']

讨论

  1. 首先,我们使用 . 从 URL 列表中提取主机名urlparse.urlparse()主机名列表如下所示:

    ['www.google.com','stackoverflow.com,...]

  2. 在下一行中,我们将每个主机分成几部分,使用点作为分隔符。hostparts 中的每个项目如下所示:

    [ ['www', 'google', 'com'], ['stackoverflow', 'com'], ... ]

  3. 有趣的工作在下一行。这一行说,“如果点之前的第一部分是www,那么域是第二部分 (p[1])。否则,域是第一部分 (p[0])。列表如下所示:

    ['谷歌','stackoverflow','谷歌','域']

  4. 我的代码不知道如何处理 login.gmail.com.hk。我希望别人能解决这个问题,因为我要迟到了。更新:看看John Kurkowski的 tldextract,它应该可以满足您的需求。

于 2013-02-22T06:05:49.240 回答