我想找到和之间的所有 <span class="">
东西</span>
p = re.compile('<span class=\"\">(.*?)\</span>', re.IGNORECASE)
text = re.findall(p, z)
例如在这种情况下<span class="">foo</span>
预期返回 foo 但它返回任何东西!为什么我的代码出错了?
干杯
由于HTML 不是常规语言,因此您确实应该使用 XML 解析器。
Python有几个可供选择:
您的原始代码按原样工作。不过,您应该使用 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>]