我正在使用 Python 2.7.2 和 BeautifulSoup (bs4) 4.1.0。 我在从页面的 html 中获取感兴趣的项目时遇到问题。 我的直觉告诉我,问题在于存在“模糊”标签匹配,它将文本视为格式错误的标签。
这是一个简化的片段来说明我的问题:
from bs4 import BeautifulSoup
html = "<span>Age 4, Pet Dog, Weight < 6 lbs (< 3 kgs)</span>"
soup = BeautifulSoup(html, 'lxml')
print soup.get_text()
# prints: "Age 4, Pet Dog, Weight"
soup2 = BeautifulSoup(html, 'html.parser')
print soup2.get_text()
# prints "Age 4, Pet Dog, Weight < 6 lbs (< 3 kgs)"
更严格的 html.parser
给我感兴趣的文本;但是,该站点随机吐出损坏的 html。这些包含格式错误的 html 的页面会导致 HTMLParser.HTMLParseError
。有没有办法获得我对使用 lxml
解析器感兴趣的完整行,或者该信息是否丢失?如果该信息丢失,是否有替代方案?
最佳答案
感谢可能重复的 Max Worg 链接,我得出的结论是输入文本在发送到 BeautifulSoup 之前必须“清理”。小于号<
是html中的保留字符,应该转义为<
如果它在文本中使用。
我写了一个函数escape_lt()
这利用了每个 <
我想转义的那个后面有一个空格字符,所有其他 html 标签后面没有空格。
from bs4 import BeautifulSoup
def escape_lt(html):
html_list = list(html)
for index in xrange(0, len(html) - 1):
if html_list[index] == '<' and html_list[index + 1] == ' ':
html_list[index] = '<'
return ''.join(html_list)
html = '<span>Age 4, Pet Dog, Weight < 6 lbs (< 3 kgs)</span>'
clean_html = escape_lt(html)
soup = BeautifulSoup(clean_html, 'lxml')
print soup.get_text()
# prints: Age 4, Pet Dog, Weight < 6 lbs (< 3 kgs)
关于Python BeautifulSoup - 防止特定的模糊/损坏标签匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28143376/