TypeError:在python中使用正则表达式时期望的字符串或缓冲区

时间:2014-03-22 07:28:40

标签: python html regex beautifulsoup

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

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

CODE:

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

2 个答案:

答案 0 :(得分:3)

您收到该错误,因为变量i的类型为<class 'bs4.element.Tag'>,而match需要缓冲区或字符串。其次,如果模式不匹配,则.match调用将返回None,因此您的.group将是空指针异常。

这是快速而肮脏的&#34;解决方案&#34;我不推荐:

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

答案 1 :(得分:0)

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