【问题标题】:TypeError: expected string or buffer for regex re.search()TypeError:正则表达式 re.search() 的预期字符串或缓冲区
【发布时间】:2015-06-11 13:57:59
【问题描述】:

我正在使用 requests 提取 HTML 页面并尝试使用正则表达式从中提取链接,但我不断收到 TypeError: expected string or buffer。

代码:

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) 从未打印过链接。

【问题讨论】:

  • 可能是编码问题。检查 HTML 块使用的编码类型。另外,请查看 BeautifulSoup4 (crummy.com/software/BeautifulSoup/bs4/doc)。它是一个 HTML 解析器。
  • 使用BeautifulSoup进行HTML解析。
  • 我也对此进行了大量搜索,但我真的不确定。我做了 print(r.encode) 并打印了 UTF-8。这有帮助吗?编辑:我现在意识到我本可以使用beautifulsoup,但我真的很想弄清楚这一点。
  • 你的代码对我有用..
  • 尝试将其编码为 ascii (stackoverflow.com/questions/4299675/…) 看看是否可行。我几乎可以肯定我之前在写刮板时遇到过这个问题。

标签: python html regex python-requests encode


【解决方案1】:

当您使用subreddit=r.text 时,我希望您在subreddit 中有多行,由'\n' 分隔。因此,您的正则表达式不会搜索超出第一个 '\n'

  • 尝试添加re.MULTILINE 选项。或
  • 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() 有问题。它没有返回任何东西。可能是代理?

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

【讨论】:

  • 第一个产生了同样的错误,第二个产生了一个'NoneType'对象没有属性'split'错误。
【解决方案2】:

如果你使用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>]

【讨论】:

  • 你的代码满足&lt;li class="first"&gt;&lt;a href="这个条件吗?
  • 是的,@AvinashRaj 显示他提取链接,比赛现在很容易
  • 我认为上面的代码将打印标签的所有 href 链接,这些链接存在于 li 标签内,其中 class = first ,我不会对该位置做任何事情的锚标签。但 OP 想要紧跟在 li 标签之后的锚标签。
【解决方案3】:

我正在运行 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/'

【讨论】:

    【解决方案4】:

    我知道这不是像你问的那样使用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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-29
      • 2013-04-18
      • 2016-01-24
      • 2020-04-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多