我正在使用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)从未打印过链接。
答案 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
答案类似:
您可以将PyQuery
与requests
一起使用吗?
这是您正在寻找的链接吗?
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