【问题标题】:Python BeautifulSoup giving different resultsPython BeautifulSoup 给出不同的结果
【发布时间】:2015-08-21 07:42:09
【问题描述】:

我正在尝试使用BeautifulSoup 解析xml 文件。考虑一个 sampleinpt xml 文件如下:

<DOC>
<DOCNO>1</DOCNO>
....
</DOC>
<DOC>
<DOCNO>2</DOCNO>
....
</DOC>
...

该文件包含 130 个&lt;DOC&gt; 标签。但是,当我尝试使用 BeautifulSoup 的 findAll 函数对其进行解析时,它会检索随机数量的标签(通常在 15 - 25 之间),但从不检索 130。我使用的代码如下:

from bs4 import BeautifulSoup
z = open("filename").read()
soup = BeautifulSoup(z, "lxml")
print len(soup.findAll('doc'))
#more code involving manipulation of results

谁能告诉我我做错了什么?提前致谢!

【问题讨论】:

  • 您正在使用 HTML 解析器;为什么不改用BeautifulSoup(z, 'xml')
  • 使用不同的解析器?

标签: python xml python-2.7 parsing beautifulsoup


【解决方案1】:

您告诉 BeautifulSoup 使用lxml 提供的 HTML 解析器。如果你有一个 XML 文档,你应该坚持使用 XML 解析器选项:

soup = BeautifulSoup(z, 'xml')

否则解析器将尝试“修复” XML 以适应 HTML 规则。 BeautifulSoup 中的 XML 解析也由 lxml 库处理。

请注意,XML 区分大小写,因此您现在需要搜索 DOC 元素。

对于 XML 文档,可能lxml 提供的 ElementTree API 效率更高;例如,它支持 XPath 查询,而 BeautifulSoup 不支持。

但是,从您的示例来看,似乎没有一个 顶级元素;就好像您的文档由一系列 XML 文档组成。这会使您的输入无效,并且解析器可能只是坚持只将第一个元素解析为顶级文档。

【讨论】:

  • 我最初尝试使用 xml 选项,但是,它显示 1 作为输出,这就是我转向 lxml 的原因
  • @AnotherCodingEnthusiast:您的文档似乎没有顶级 XML 标记,使其无效 XML。在这种情况下,解析器可以选择只处理第一个标签。
猜你喜欢
  • 1970-01-01
  • 2019-05-19
  • 1970-01-01
  • 2017-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-15
相关资源
最近更新 更多