【问题标题】:TypeError: expected string or buffer while using regular expression in pythonTypeError:在python中使用正则表达式时预期的字符串或缓冲区
【发布时间】:2014-04-29 18:22:15
【问题描述】:

我写了这段代码来删除像这样匹配的标签

<p><b>See also:</b> <a href=\"(.*?)\">(.*)</a>(.*)</p>

代码:

import mechanize
import urllib2
from bs4 import BeautifulSoup
import re
med = 'paracetamol'
listiterator = []
listiterator[:] = range(2,16)
br = mechanize.Browser()
br.set_handle_robots(False)
r=br.open("http://www.drugs.com/search-wildcard-phonetic.html")
br.select_form(nr=0)
br.form['searchterm'] = med
br.submit()
url = br.response().geturl()
print url
mainurl = urllib2.urlopen(url).read()
subpages = re.findall("<a href=\"(.*?).html\">[^>]*>", mainurl)
for sub in subpages:
    if sub.startswith("http:"):
        soup = BeautifulSoup(urllib2.urlopen(sub).read())
        m = soup.find_all("div", {"class":"contentBox"})
        head = m[0].find_all(["h2","p"])
        for i in head:
            m = re.match("<p><b>See also:</b> <a href=\"(.*?)\">(.*)</a>(.*)</p>").group()
            if not m:
                print i         
        break

我收到了这个错误:

m = re.match("<p><b>See also:</b> <a href=\"(.*?)\">(.*)</a>(.*)</p>",i).group()
  File "/usr/lib/python2.7/re.py", line 137, in match
    return _compile(pattern, flags).match(string)
TypeError: expected string or buffer

【问题讨论】:

标签: python html regex beautifulsoup


【解决方案1】:

.find_all(['h2', 'p']) 返回 Tag 对象,但 re.match 需要一个字符串。不要直接在Tag 上致电re.matchBeautifulSoup 允许您将正则表达式传递给 .find*() 方法。

【讨论】:

    【解决方案2】:

    您收到该错误是因为变量i 的类型是&lt;class 'bs4.element.Tag'&gt;,而match 需要一个缓冲区或字符串。其次,如果模式不匹配,那么.match调用将返回None,所以你的.group将是一个空指针异常。

    这是一个又快又脏我不推荐的“解决方案”:

    m = re.match("<p><b>See also:</b> <a href=\"(.*?)\">(.*)</a>(.*)</p>", str(i))
    if not m:
        print i
    

    更好的解决方案是重写而不尝试自己解析 HTML,让 BeautifulSoup 完成它的工作。例如,排除包含文本 See also 和锚标记的项目,而不是您的正则表达式模式:

    if i.find(text='See also:') and i.find('a'):
        continue
    print i
    

    【讨论】:

    • str(i) 按照您的正则表达式所期望的格式完全 格式化 html 的可能性有多大? (忽略它使用正则表达式来解析 html 文本,同时使用 html 解析器将其结构解析为原始 html 而不是使用构建树的事实)。
    • @J.F.Sebastian 我不知道。我不推荐它。
    • @janos:显然,你的“我不推荐”对OP没有影响。 str 更快、更简单、更诱人。
    猜你喜欢
    • 2015-06-11
    • 2016-01-24
    • 2016-07-15
    • 1970-01-01
    • 2013-04-18
    • 2015-12-22
    • 2017-08-29
    相关资源
    最近更新 更多