我写了这段代码来删除像这样匹配的标签
<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
答案 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
上致电Tag
。 BeautifulSoup
允许您将正则表达式传递给.find*()
方法。