Python BeautifulSoup - 防止特定的模糊/损坏标签匹配

标签 python html parsing tags beautifulsoup

我正在使用 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中的保留字符,应该转义为&lt;如果它在文本中使用。

我写了一个函数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] = '&lt;'
    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/

相关文章:

python - 确定三角形内的所有离散点

python - 在回调模式下使用 python 和 pyaudio 的线程问题

html - 如何使下拉菜单在悬停时保持打开状态

html - rel ="bookmark"链接属性是什么意思?

html - 具有宽度动画的 CSS 文本对齐延迟

c - 从输入字符串中解析数据

c# - 我怎样才能将地址​​解析成它的各个组成部分?

java - Hadoop - 管道分隔符无法识别

python - 包含引号的文本的句子标记化

Python、Selenium Webdriver : Spans are not loaded for Firefox driver