我正在使用Python抓取reddit用户名,并且我试图从URL中提取用户名。 URL如下所示:
https://www.reddit.com/user/ExampleUser
这是我的代码:
def extract_username(url):
start = url.find('https://www.reddit.com/user/') + 28
end = url.find('?', start)
end2 = url.find("/", start)
return url[start:end] and url[start:end2] and url[start:]
第一部分有效,但删除问号并转发斜线doesen&#t; t。也许我正在使用"和"关键字错了?这意味着我有时会得到这样的东西:
ExampleUser/
ExampleUser/comments/
ExampleUser/submitted/
ExampleUser/gilded/
ExampleUser?sort=hot
ExampleUser?sort=new
ExampleUser?sort=top
ExampleUser?sort=controversial
我知道我可以使用api,但我想学习如何在没有api的情况下使用api。我也听说过正则表达式,但它们还不是很慢吗?
答案 0 :(得分:3)
您可以使用re
模块。
>>> s = "https://www.reddit.com/user/ExampleUser/comments/"
>>> import re
>>> re.search(r'https://www.reddit.com/user/([^/?]+)', s).group(1)
'ExampleUser'
[^/?]+
否定字符类,它匹配任何字符,但不匹配/
或?
一次或多次。 {_ 1}}在否定字符类周围捕获组捕获那些匹配的字符。稍后我们可以通过反向引用来引用捕获的字符(例如()
引用组索引1)。
通过定义单独的函数。
\1
答案 1 :(得分:2)
这会删除'?'之后的所有内容。然后拆分' /',检索第五个元素,即用户名:
>>> s = 'https://www.reddit.com/user/ExampleUser?sort=new'
>>> s.split('?')[0].split('/')[4]
'ExampleUser'
这也适用于您展示的其他案例。例如:
>>> s = 'https://www.reddit.com/user/ExampleUser/comments/'
>>> s.split('?')[0].split('/')[4]
'ExampleUser'
>>> s = 'https://www.reddit.com/user/ExampleUser'
>>> s.split('?')[0].split('/')[4]
'ExampleUser'
答案 2 :(得分:0)
仅仅是为了踢,这是一个使用find的例子。基本上,您只想在找到分隔符的地方尽量减少,或者如果根本找不到分隔符,则只需要结束:
def extract_username(url):
username = url[len('https://www.reddit.com/user/'):]
end = min([i for i in (len(username),
username.find('/'),
username.find('?') ) if i >=0])
return username[:end]
for url in ('https://www.reddit.com/user/ExampleUser',
'https://www.reddit.com/user/ExampleUser/submitted/',
'https://www.reddit.com/user/ExampleUser?sort=controversial'):
print extract_username(url)