TypeError:regex re.search()的预期字符串或缓冲区

时间:2015-04-07 04:17:19

标签: python html regex python-requests encode

我正在使用requests拉取一个HTML页面并尝试使用正则表达式从中提取链接,但我一直收到TypeError:期望的字符串或缓冲区。

代码:

r = requests.get('https://reddit.com/r/spacex')
subreddit=r.text
match=re.search(r'(<li class="first"><a href=")(.+)(")', subreddit)
if match is not None:
    print(match.group(2))

但是,如果我拿一大块HTML并将其硬编码为字符串,那么我的代码就可以了:

subreddit='<li class="first"><a href="http://www.reddit.com/r/spacex/comments/3115xw/latest_update_pic_of_slc4_pad_shows_ln2_tankage/"'
r = requests.get('https://reddit.com/r/spacex')
match=re.search(r'(<li class="first"><a href=")(.+)(")', subreddit)
if match is not None:
    print(match.group(2))

我也尝试过做

 match=re.search(r'(<li class="first"><a href=")(.+)(")', str(subreddit))

作为这里的建议但是没有用。我没有收到任何错误但是match.group(2)从未打印过链接。

4 个答案:

答案 0 :(得分:0)

当您执行subreddit时,我预计'\n'中有多行由subreddit=r.text分隔。因此,您的正则表达式不会超出第一个'\n'

  • 尝试添加re.MULTILINE选项。 OR
  • 搜索for line in subreddit.split('\n')
  • 的每一行

r = requests.get('https://reddit.com/r/spacex')
subreddit=r.text
print('subreddit:' + subreddit)
subreddit.split('\n')

如果上面的代码生成NoneType has no split(),那么您的requests.get()就会出现问题..它没有返回任何内容..可能是代理?

无论如何发布此代码的输出..

答案 1 :(得分:0)

如果你使用BeautifulSoup,对你来说会更容易:

>>> from bs4 import BeautifulSoup
>>> import urllib2
>>> soup = BeautifulSoup(urllib2.urlopen('https://reddit.com/r/spacex').read())
>>> for x in soup.find_all("li", "first")
...     print x.a['href']

或者您可以这样做:

>>> soup.select('a[href="https://www.reddit.com/r/spacex/comments/3115xw/latest_update_pic_of_slc4_pad_shows_ln2_tankage/"]')
[<a class="comments may-blank" href="https://www.reddit.com/r/spacex/comments/3115xw/latest_update_pic_of_slc4_pad_shows_ln2_tankage/">10 comments</a>]

答案 2 :(得分:0)

我正在运行python 3.4,这个使用正则表达式的代码对我有效。

>>> import requests
>>> from bs4 import BeautifulSoup
>>> r = requests.get('https://reddit.com/r/spacex')
>>> re.search(r'(<li class="first"><a href=")(.+?)(")', r.text).group(2)
'https://www.reddit.com/r/spacex/comments/31p51d/tory_bruno_posts_infographic_of_ula_vs_spacex/'

答案 3 :(得分:0)

我知道这不是像你问的那样使用re,但与上面的BeautifulSoup答案类似:

您可以将PyQueryrequests一起使用吗?

这是您正在寻找的链接吗?

import requests
from pyquery import PyQuery as PyQuery

r = requests.get('https://reddit.com/r/spacex')
subreddit = r.text
pyq_to_parse = PyQuery(subreddit)
result = pyq_to_parse(".first").find("a")
print result