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

2024-04-26 00:03:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的是python2.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解析器来获取我感兴趣的整行代码,还是丢失了这些信息?如果这些信息丢失了,还有其他选择吗?在


Tags: 标记文本agehtml格式错误页面感兴趣
1条回答
网友
1楼 · 发布于 2024-04-26 00:03:40

多亏了可能的重复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)

相关问题 更多 >