使用Python从URL获取子域

时间:2011-08-03 11:37:42

标签: python string url

例如,地址是:

Address = http://lol1.domain.com:8888/some/page

我想将子域保存到变量中,所以我可以这样做;

print SubAddr
>> lol1

9 个答案:

答案 0 :(得分:15)

urlparse.urlparse会将网址拆分为协议,位置,端口等。然后您可以按.拆分位置以获取子域。

url = urlparse.urlparse(address)
subdomain = url.hostname.split('.')[0]

答案 1 :(得分:12)

程序包tldextract使此任务变得非常简单,如果您需要任何进一步的信息,可以按照建议使用 urlparse

% Number of Samples.
n = 1:512;

% Given Signal
signal = exp(-5*(n-250).^2/100000).*cos(pi*(n-250)/6);

% Range of SNR
Snr = 30:-5:-10

% Calculate and display MSE between the original signal and noisy signal

请注意 tldextract 正确处理子域。

答案 2 :(得分:5)

这里的精彩答案的修改版本:How to extract top-level domain name (TLD) from URL

您需要here

中有效tld的列表
from __future__ import with_statement
from urlparse import urlparse

# load tlds, ignore comments and empty lines:
with open("effective_tld_names.dat.txt") as tldFile:
    tlds = [line.strip() for line in tldFile if line[0] not in "/\n"]

class DomainParts(object):
    def __init__(self, domain_parts, tld):
        self.domain = None
        self.subdomains = None
        self.tld = tld
        if domain_parts:
            self.domain = domain_parts[-1]
            if len(domain_parts) > 1:
                self.subdomains = domain_parts[:-1]

def get_domain_parts(url, tlds):
    urlElements = urlparse(url).hostname.split('.')
    # urlElements = ["abcde","co","uk"]
    for i in range(-len(urlElements),0):
        lastIElements = urlElements[i:]
        #    i=-3: ["abcde","co","uk"]
        #    i=-2: ["co","uk"]
        #    i=-1: ["uk"] etc

        candidate = ".".join(lastIElements) # abcde.co.uk, co.uk, uk
        wildcardCandidate = ".".join(["*"]+lastIElements[1:]) # *.co.uk, *.uk, *
        exceptionCandidate = "!"+candidate

        # match tlds: 
        if (exceptionCandidate in tlds):
            return ".".join(urlElements[i:]) 
        if (candidate in tlds or wildcardCandidate in tlds):
            return DomainParts(urlElements[:i], '.'.join(urlElements[i:]))
            # returns ["abcde"]

    raise ValueError("Domain not in global list of TLDs")

domain_parts = get_domain_parts("http://sub2.sub1.example.co.uk:80",tlds)
print "Domain:", domain_parts.domain
print "Subdomains:", domain_parts.subdomains or "None"
print "TLD:", domain_parts.tld

给你:

Domain: example
Subdomains: ['sub2', 'sub1']
TLD: co.uk

答案 3 :(得分:2)

您正在寻找的是: http://docs.python.org/library/urlparse.html

例如: ".".join(urlparse('http://www.my.cwi.nl:80/%7Eguido/Python.html').netloc.split(".")[:-2])

将为您完成工作(将返回“www.my”)

答案 4 :(得分:0)

一种非常基本的方法,没有任何健全性检查可能看起来像:

address = 'http://lol1.domain.com:8888/some/page'

host = address.partition('://')[2]
sub_addr = host.partition('.')[0]

print sub_addr

这当然假设当你说'子域'时你的意思是主机名的第一部分,所以在下面的例子中,'www'将是子域名:

http://www.google.com/

这是你的意思吗?

答案 5 :(得分:0)

为了提取主机名,我将使用urllib2中的urlparse:

>>> from urllib2 import urlparse
>>> a = "http://lol1.domain.com:8888/some/page"
>>> urlparse.urlparse(a).hostname
'lol1.domain.com'

至于如何提取子域,您需要覆盖FQDN可能更长的情况。你如何做到这一点取决于你的目的。我可能会建议剥离最合适的两个组件。

E.g。

>>> urlparse.urlparse(a).hostname.rpartition('.')[0].rpartition('.')[0]
'lol1'

答案 6 :(得分:0)

我们可以使用https://github.com/john-kurkowski/tldextract解决此问题...

很简单。

>>> ext = tldextract.extract('http://forums.bbc.co.uk')
>>> (ext.subdomain, ext.domain, ext.suffix)
('forums', 'bbc', 'co.uk')

答案 7 :(得分:0)

tldextract将TLD与URL的注册域和子域分开。

安装

pip install tldextract

对于当前问题:

import tldextract

address = 'http://lol1.domain.com:8888/some/page'
domain = tldextract.extract(address).domain
print("Extracted domain name : ", domain)

输出:

Extracted domain name :  domain

此外,there是与tldextract.extract端的用法极为相关的许多示例。

答案 8 :(得分:0)

首先导入 tldextract,因为这会将 URL 拆分为其组成部分,例如:子域。域和后缀

import tldextract

然后声明一个存储查询结果的变量(比如 ext)。我们还必须为它提供带双引号的括号中的 URL。如下图:

ext = tldextract.extract("http://lol1.domain.com:8888/some/page")

如果我们只是尝试运行 ext 变量,输出将是:

ExtractResult(subdomain='lol1', domain='domain', suffix='com')

那么如果您只想使用子域或域或后缀,则分别使用以下任何代码。

ext.subdomain

结果将是:

'lol1'
ext.domain

结果将是:

'domain'
ext.suffix

结果将是:

'com'

此外,如果您只想将子域的结果存储在变量中,请使用以下代码:

Sub_Domain = ext.subdomain

然后打印子域

Sub_Domain

结果将是:

'lol1'