python - BeautifulSoup (bs4) 解析错误

标签 python html python-2.7 beautifulsoup

使用来自 python 2.7.6 的 bs4 解析此示例文档:

<html>
<body>
<p>HTML allows omitting P end-tags.

<p>Like that and this.

<p>And this, too.

<p>What happened?</p>

<p>And can we <p>nest a paragraph, too?</p></p>

</body>
</html>

使用:

from bs4 import BeautifulSoup as BS
...
tree = BS(fh)

多年来,HTML 允许省略各种元素类型的结束标记,包括 P(检查架构或解析器)。但是,bs4 在此文档中的 prettify() 显示它在看到 之前不会结束任何这些段落:

<html>
 <body>
  <p>
   HTML allows omitting P end-tags.
   <p>
    Like that and this.
    <p>
     And this, too.
     <p>
      What happened?
     </p>
     <p>
      And can we
      <p>
       nest a paragraph, too?
      </p>
     </p>
    </p>
   </p>
  </p>
 </body>

这不是 prettify() 的错,因为手动遍历树我得到了相同的结构:

<[document]>
    <html>
        ␊
        <body>
            ␊
            <p>
                HTML allows omitting P end-tags.␊␊
                <p>
                    Like that and this.␊␊
                    <p>
                        And this, too.␊␊
                        <p>
                            What happened?
                        </p>
                        ␊
                        <p>
                            And can we 
                            <p>
                                nest a paragraph, too?
                            </p>
                        </p>
                        ␊
                    </p>
                </p>
            </p>
        </body>
        ␊
    </html>
    ␊
</[document]>

现在,这将是 XML 的正确结果(至少到 为止,此时它应该报告 WF 错误)。但这不是 XML。给了什么?

最佳答案

文档位于 http://www.crummy.com/software/BeautifulSoup/bs4/doc/#installing-a-parser讲述如何让 BS4 使用不同的解析器。显然默认是 html.parse,BS4 文档说它在 Python 2.7.3 之前被破坏了,但显然仍然存在上述 2.7.6 中描述的问题。

切换到“lxml”对我来说不成功,但切换到“html5lib”会产生正确的结果:

tree = BS(htmSource, "html5lib")

关于python - BeautifulSoup (bs4) 解析错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29954170/

相关文章:

python - pandas table.loc lambda函数无法根据条件对表进行切片

python - 始终在 wcs 轴上显示整个刻度标签

python - 如何在 Python 中对 Matplotlib 进行线程化?

python - 如何在单个 Flask 应用程序中使用 Plotly-Dash 创建多个仪表板?

html - 如何减少下拉菜单项之间的空间?

Python:如何打印UTF-8字符?

python - 检查所有位是否为 1 的最佳方法是什么?

python - Matplotlib 极坐标图径向轴偏移

javascript - 如何在用户触发后呈现模态

javascript - Bootstrap 3 菜单下拉奇怪BUG