为什么lxml html解析器没有解析完整的文件?

时间:2017-08-29 20:32:23

标签: html parsing lxml elementtree

我正在尝试使用lxml解析一个16Mb的html文件。我的实际任务是获取所有doc标签和每个doc标签,如果docno标签的值与我的文档列表匹配,我会提取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。

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

1 个答案:

答案 0 :(得分:0)

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


感谢大家的帮助。