【问题标题】:Python BeautifulSoup - Prevent Specific Fuzzy/Corrupt Tag MatchingPython BeautifulSoup - 防止特定的模糊/损坏标签匹配
【发布时间】:2015-03-24 11:13:45
【问题描述】:

我正在使用 Python 2.7.2 和 BeautifulSoup (bs4) 4.1.0。 我在从页面的 html 中获取感兴趣的项目时遇到问题。 我的直觉告诉我,问题在于存在一个“模糊”标签匹配,它将文本视为格式错误的标签。

这是一个简化的 sn-p 来说明我的问题:

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 解析器感兴趣的完整行,或者该信息是否丢失?如果该信息丢失,是否有替代方法?

【问题讨论】:

标签: python html parsing tags beautifulsoup


【解决方案1】:

感谢可能重复的 Max Worg 链接,我得出的结论是输入文本在发送到 BeautifulSoup 之前必须“清理”。小于号&amp;lt;是html中的保留字符,如果在文本中使用,应转义为&amp;lt;

我写了一个函数escape_lt(),它利用了我想转义的每个&amp;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)

【讨论】:

    猜你喜欢
    • 2011-11-20
    • 1970-01-01
    • 2010-12-14
    • 2011-02-11
    • 1970-01-01
    • 2014-01-02
    • 1970-01-01
    • 2016-09-11
    • 1970-01-01
    相关资源
    最近更新 更多