Python从URL中提取用户名

时间:2015-01-19 06:59:31

标签: python web-scraping

我正在使用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。我也听说过正则表达式,但它们还不是很慢吗?

3 个答案:

答案 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)