Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中获取url的特定部分_Python_String_List_Url_Urlparse - Fatal编程技术网

在python中获取url的特定部分

在python中获取url的特定部分,python,string,list,url,urlparse,Python,String,List,Url,Urlparse,我正在使用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(存储在列表中或其他地方),所以我想要的是,需要在url中找到上面的域名,并获取www.之后和之前的部分,也就是说,字符串在第一个点之后和第二个点之前开始,这在当前场景

我正在使用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(存储在列表中或其他地方),所以我想要的是,需要在url中找到上面的
域名
,并获取
www.
之后和
之前的部分,也就是说,字符串在
第一个点
之后和
第二个点
之前开始,这在当前场景中只会导致
google

因此,假设给定的url是url,给定的url是
www.gmail.com
,我应该只获取
gmail
,所以不管给定的url是什么,代码都应该获取从第一个点开始,在第二个点之前的部分

案例2:

另外,一些url可能会像下面这样直接给出
domain.com、stackoverflow.com
,而url中没有
www
,在这种情况下,它应该只获取
stackoverflow
domain

最后,我的意图是从url中获取主名称,
gmail、stackoverflow、google
等等

通常,如果我有一个url,我可以使用
列表切片
,并将获取字符串,但我将有许多ULR,因此需要动态获取上面提到的所需部分


有人能告诉我如何满足上述概念吗

你为什么不能这样做:

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语句,因为某些域可能会从您希望删除的其他内容开始。

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

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']
讨论
  • 首先,我们使用
    urlparse.urlparse()
    从URL列表中提取主机名。主机名列表如下所示:

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

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

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

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

    ['google'、'stackoverflow'、'google'、'domain']

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


  • 使用一组预定义的顶级DOA电源怎么样

    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
    
    重新导入
    从URLPRASE导入URLPRASE
    #伪造顶级域名…例如:co.uk、co.in、co.cc
    TOPLEVEL=[“.co.[a-zA-Z]+”,“.false.[a-zA-Z]+”]
    def TLD(rgx,主机,最大值=4):#4=co.name
    match=re.findall((%s)“%rgx,主机,re.IGNORECASE)
    如果匹配:
    
    如果len(匹配[0].split(“.”[1]),那么类似“login.gmail.com.hk”的内容呢?同时返回“gmail”“?是的,当然,这就是我的意思,但我不知道是否有可能以这种方式获取?嗨,我否决了这一点,因为真正的解决方案是使用你提到的库:。您应该更改您的答案并删除建议的代码,因为该建议只涵盖可能的名称的一小部分。改为采取行动;-)有些系统,比如我的工作场所的系统,我们不允许安装第三方软件包,比如tldextract。这就是我的解决方案。除了否决投票外,您可能还希望展示我的解决方案不起作用的实例,以及修复建议。我为浏览器供应商(Opera,最近是Mozilla)工作了几年,相信我:这是一个非常困难的问题,我们多次希望找到解决方案。直到Mozilla成立,我们才真正面对挑战——即使是现在,为了解决一个看起来很简单的问题而发送所有字节的信息似乎也很奇怪。很抱歉,我不会列出失败的案例并尝试解决它们。域名系统太复杂了:-/