【问题标题】:Python3, BeautifulSoup dropping a paragraph tagPython3,BeautifulSoup 删除段落标签
【发布时间】:2014-10-04 17:20:02
【问题描述】:

如果有以下 html 块:

chunk = '<p>BLA bla bla html... <div>Copyright 2014 NPR</div></p>'

当我执行以下操作时:

from bs4 import BeautifulSoup
soup = BeautifulSoup(chunk)

块变成这样:

>>> soup
<html><body><p>BLA bla bla html... </p><div>Copyright 2014 Someone</div></body></html>

段落标签被提前关闭,并且 div 被拉出它。

我对此感到惊讶。这是 BeautifulSoup 的预期行为吗?如果是这样,谁能解释它为什么这样做?

编辑: 请注意,我意识到这个 html 是无效的,但我没有意识到 BeautifulSoup 会在这种程度上编辑无效的 html。 Here's a related SO question on invalid HTML (div instead a p tag)

【问题讨论】:

    标签: python html python-3.x beautifulsoup html-parsing


    【解决方案1】:

    您提供的 HTML 不是格式正确的有效 HTML。在这种情况下,如documentation中所述:

    HTML 解析器之间也存在差异。如果你给美丽 汤一个格式完美的 HTML 文档,这些差异无关紧要。 一个解析器会比另一个更快,但它们都会给你一个 看起来与原始 HTML 文档一模一样的数据结构。

    但是如果文档的格式不完美,不同的解析器会 给出不同的结果。

    所以,depends on the underlying parser 使用的行为确实是 BeautifulSoup。而且,由于您没有明确指定它,BeautifulSoup 选择它according to the ranking

    如果您不指定任何内容,您将获得最好的 HTML 解析器 安装。 Beautiful Soup 将 lxml 的解析器评为最佳,然后 html5lib 的,然后是 Python 的内置解析器。

    这是不同的解析器尝试对您提供的 html 执行的操作:

    >>> from bs4 import BeautifulSoup
    >>> chunk = '<p>BLA bla bla html... <div>Copyright 2014 NPR</div></p>'
    
    # html.parser
    >>> BeautifulSoup(chunk, 'html.parser')
    <p>BLA bla bla html... <div>Copyright 2014 NPR</div></p> 
    
    # html5lib
    >>> BeautifulSoup(chunk, 'html5lib')
    <html><head></head><body><p>BLA bla bla html... </p><div>Copyright 2014 NPR</div><p></p></body></html>
    
    # lxml
    >>> BeautifulSoup(chunk, 'lxml')
    <html><body><p>BLA bla bla html... </p><div>Copyright 2014 NPR</div></body></html>
    
    # xml
    >>> BeautifulSoup(chunk, 'xml')
    <?xml version="1.0" encoding="utf-8"?>
    <p>BLA bla bla html... <div>Copyright 2014 NPR</div></p>
    

    根据输出,您在这个特定的 python 环境中安装了lxml,并且BeautifulSoup 将其用作底层解析器,因为您没有明确指定它。

    【讨论】:

    • 感谢您提供的示例。这很有帮助。
    • 跟进:这是一个非常好的书面回复,我今天使用其中的信息解决了我几天来遇到的问题。再次感谢!
    猜你喜欢
    • 2013-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-19
    • 1970-01-01
    • 1970-01-01
    • 2020-02-26
    相关资源
    最近更新 更多