【问题标题】:Why is lxml html parser not parsing the complete file?为什么 lxml html 解析器不解析完整的文件?
【发布时间】:2017-08-29 20:32:23
【问题描述】:

我正在尝试使用 lxml 解析一个 16Mb 的 html 文件。我的实际任务是获取所有 doc 标签,如果 docno 标签的值与我的 doc 列表匹配,则为每个 doc 标签提取 doc 标签的内容。

self.doc_file_list 是一个列表,其中包含我需要解析的 16Mb 文件的路径。 file 是文件的绝对路径。

这是我目前使用的代码

for file in file(self.doc_file_list,'r'):
    tree = etree.parse(file.strip(), parser)
    doc = tree.findall('.//doc')
    for elem in doc:
        docno = elem.find('.//docno').text
        if docno in self.doc_set:
            print >> out, etree.tostring(elem)

我使用 etree.tostring(tree) 检查了树的内容,它不解析完整的文件,只解析实际文件的一些 kb。

注意:我没有收到任何错误消息,但树的解析内容不完整,因此我无法获取整个列表。

【问题讨论】:

  • 编辑确实很清楚。好吧,我想这将有助于查看问题显示的实际示例文件。或者,或者,自己尝试找到它停止解析的地方,看看那里是否有问题。查看在停止之前/之后删除内容时问题是否仍然存在。最终,您应该能够将其范围缩小到特定的有问题的结构。
  • ...如果你发现文件大小确实是个问题(如果你在一个小系统上,用 libxml 加载一个 16MB 的文件通常会吃掉大约 100MB),也许使用 XmlTextReader API而是。

标签: html parsing lxml elementtree


【解决方案1】:

我终于能够解决这个问题。我检查了生成的树,它没有解析整个文档。这是因为文件严重损坏。您可以在链接上查看此信息:lxml.de/parsing.html(删除 http,因为 stackoverflow 不允许我添加超过 2 个链接)。
可以使用以下两种方法之一解决此损坏 html 文档的问题:
1。除了使用 html 解析器,您还可以使用 lxml 提供的 ElementSoup。它使用 BeautifulSoup 解析器来处理损坏的 html 文档。链接:http://lxml.de/lxmlhtml.html
注意:这种方法不适合我。
2。另一种方法是直接使用 BeautifulSoup 并使用它提供的解析器。提供了许多解析器选项,您需要找出最适合您的解析器选项。对我来说, html.parser 有效。 链接:https://www.crummy.com/software/BeautifulSoup/bs4/doc/#attributes


感谢大家的帮助。

【讨论】:

    猜你喜欢
    • 2012-07-12
    • 2023-03-03
    • 2012-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-31
    • 2011-04-03
    • 1970-01-01
    相关资源
    最近更新 更多