我是编程和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()
尝试了许多其他组合。
你能告诉我如何解决这个相对简单的问题吗?
答案 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