【问题标题】:parse xml with many roots using BeautifulSoup使用 BeautifulSoup 解析具有多个根的 xml
【发布时间】:2015-01-19 03:40:54
【问题描述】:

我正在尝试解析使用 BS4 从 Google 下载的大型 xml 文件。但是,该文件由多个根构成,因此xml parser 只能在第一个块中解析。

我使用以下命令加载文件

xml = BeautifulSoup("test.xml", "xml")

test.xml 文件如下所示,它有很多根:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE us-patent-grant SYSTEM "us-patent-grant-v42-2006-08-23.dtd" [ ]>
<us-patent-grant lang="EN" .....>
A LOT of information
</us-patent-grant>

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE us-patent-grant SYSTEM "us-patent-grant-v42-2006-08-24.dtd" [ ]>
<us-patent-grant lang="EN" .....>
A LOT of information
</us-patent-grant>

.......

html 解析器可以读取完整文件。但是,一个常规的此类文件包含超过 10k 个根。使用html 解析器读取速度很慢,并且会占用我所有的内存。有没有办法解决这个问题?

感谢任何帮助。

【问题讨论】:

  • 那之后你的代码是什么?即,您如何尝试检索块?
  • “文件的第一个块”是什么意思?另外,您能否提供一个示例 XML 文件(通过链接或其他方式)。
  • @khampson,我只是打印我的 xml,它只有第一个块,而不是完整的文件。我怀疑标签的第二行可能是问题,但我对xml格式知之甚少。
  • 哦,好的。所以实际上你有多个 xml 文件连接成一个。 Google API 真的是这样提供的吗?这似乎不寻常......正如@GuyGavriely 所建议的那样,lxml 将是一个不错的选择,因为它是基于 C 的解析器的 Python 包装器,应该更快。
  • @ZhenSun 因为你特别提到了我,所以我会注意到 Guy Gavriely 在下面解释的“多根”问题是我提出问题的动机。由于这个问题,我也无法(在我短暂的尝试中)使lxml 解析文档。相反,重新格式化文档可能更容易。否则,您可能会考虑尝试these XML parsers 之一。

标签: python xml beautifulsoup


【解决方案1】:

一个有效的 xml 文件只有一个根,要么将该单一根添加到文件中,要么告诉解析器将其解析为“html”(这是默认值),例如:

>>> from bs4 import BeautifulSoup
>>> BeautifulSoup(open("test.xml"), "xml")
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE us-patent-grant SYSTEM "us-patent-grant-v42-2006-08-23.dtd">
<us-patent-grant lang="EN">
1
</us-patent-grant>
>>> BeautifulSoup(open("test.xml"))
<!DOCTYPE us-patent-grant SYSTEM "us-patent-grant-v42-2006-08-23.dtd">
<html><body><p>]&gt;
<us-patent-grant lang="EN">
1
</us-patent-grant>
<us-patent-grant lang="EN">
2
</us-patent-grant>
</p></body></html>
>>> 

【讨论】:

  • 谢谢!是的,“html”解析器可以读取完整文件。但是,一个常规文件包含大约 10k 个这样的块。使用“html”阅读永远占用我所有的记忆。我想知道“xml”解析器的正确方法是否可以改进。
  • 对于大文件,请考虑使用 lxml lxml.de 或将该文件拆分为较小的文件或添加单个根作为建议
  • 如何将单个根添加到文件中?我需要删除文件中的所有其他标签吗?
  • 如果该标题行,以
  • 谢谢。然后我看不到这样做的简单方法。有没有一种快速的方法可以将xml 文件作为文本文件读取然后查找和更改?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多