如何操作URL字符串以提取单个片段?

时间:2014-09-10 18:51:32

标签: python string parsing split str-replace

我是编程和Python的新手。

背景

我的程序接受了一个网址。我想从网址中提取用户名。

用户名是子域名。 如果子域名为“'”,则用户名应为域的主要部分。域名的其余部分应该丢弃(例如,' .com /',' .org /')

我尝试过以下方法:

def get_username_from_url(url):
    if url.startswith(r'http://www.'):
        user = url.replace(r'http://www.', '', 1)
        user = user.split('.')[0]
        return user
    elif url.startswith(r'http://'):
        user = url.replace(r'http://', '', 1)
        user = user.split('.')[0]
        return user

easy_url = "http://www.httpwwwweirdusername.com/"    
hard_url = "http://httpwwwweirdusername.blogger.com/"

print get_username_from_url(easy_url)
# output = httpwwwweirdusername (good! expected.)

print get_username_from_url(hard_url)
# output = weirdusername (bad! username should = httpwwwweirdusername)

我已使用strip()split()replace()尝试了许多其他组合。

你能告诉我如何解决这个相对简单的问题吗?

2 个答案:

答案 0 :(得分:4)

有一个名为urlparse的模块专门用于该任务:

>>> from urlparse import urlparse
>>> url = "http://httpwwwweirdusername.blogger.com/"
>>> urlparse(url).hostname.split('.')[0]
'httpwwwweirdusername'

如果http://www.httpwwwweirdusername.com/,则输出www,这是不合需要的。有一些解决方法可以忽略www部分,例如,从分割的hostname获取不等于www的第一项:

>>> from urlparse import urlparse

>>> url = "http://www.httpwwwweirdusername.com/"
>>> next(item for item in urlparse(url).hostname.split('.') if item != 'www')
'httpwwwweirdusername'

>>> url = "http://httpwwwweirdusername.blogger.com/"
>>> next(item for item in urlparse(url).hostname.split('.') if item != 'www')
'httpwwwweirdusername'

答案 1 :(得分:0)

可以使用正则表达式执行此操作(可能会修改正则表达式以更加准确/高效)。

import re
url_pattern = re.compile(r'.*/(?:www.)?(\w+)')
def get_username_from_url(url):
    match = re.match(url_pattern, url)
    if match:
        return match.group(1)

easy_url = "http://www.httpwwwweirdusername.com/"
hard_url = "http://httpwwwweirdusername.blogger.com/"

print get_username_from_url(easy_url)
print get_username_from_url(hard_url)

这让我们产生了:

httpwwwweirdusername
httpwwwweirdusername