0

我想找到和之间的所有 <span class=""> 东西</span>

p = re.compile('<span class=\"\">(.*?)\</span>', re.IGNORECASE)
text = re.findall(p, z)

例如在这种情况下<span class="">foo</span>预期返回 foo 但它返回任何东西!为什么我的代码出错了?

干杯

4

2 回答 2

4

由于HTML 不是常规语言,因此您确实应该使用 XML 解析器

Python有几个可供选择:

于 2012-09-01T15:39:26.047 回答
2

您的原始代码按原样工作。不过,您应该使用 HTML 解析器。

import re
p = re.compile('<span class=\"\">(.*?)\</span>', re.IGNORECASE)
z = '<span class="">foo</span>'
text = re.findall(p, z)
print text

输出:

['foo']

编辑

正如蒂姆指出的那样,re.DOTALL应该使用,否则以下将失败:

import re
p = re.compile('<span class="">(.*?)\</span>', re.IGNORECASE|re.DOTALL)
z = '''<span class=""> a more
complicated foo</span>'''
text = re.findall(p, z)
print text

即使这样,嵌套跨度也会失败:

import re
p = re.compile('<span class="">(.*?)\</span>', re.IGNORECASE|re.DOTALL)
z = '''<span class=""> a more
complicated<span class="other">other</span>foo</span>'''
text = re.findall(p, z)
print text

输出(失败):

[' a more\ncomplicated<span class="other">other']

所以使用像BeautifulSoup这样的 HTML 解析器:

from BeautifulSoup import BeautifulSoup
soup = bs(z)
p = re.compile('<span class="">(.*?)\</span>', re.IGNORECASE|re.DOTALL)
z = '''<span class=""> a more
complicated<span class="other">other</span>foo</span>'''
soup = BeautifulSoup(z)
print soup.findAll('span',{'class':''})
print
print soup.findAll('span',{'class':'other'})

输出:

[<span class=""> a more
complicated<span class="other">other</span>foo</span>]

[<span class="other">other</span>]
于 2012-09-01T15:42:47.150 回答