2017-08-29 99 views
1

我想解析一个使用lxml的16Mb html文件。我的实际任务是获取所有文档标记和每个doc标记,如果docno标记的值与我的文档列表匹配,我将提取doc标记的内容。为什么lxml html解析器不解析完整文件?

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

这是我使用目前

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(树)检查树的内容和它不解析整个文件,只解析的实际文件的一些KB。

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

+0

许多与编辑确实清除。那么,我想这将有助于查看问题所示的实际示例文件。或者,也可以自己尝试找到停止解析的位置,并查看是否有错误。查看问题在停止之前/之后移除时是否仍然存在。最终你应该能够把它缩小到一个特定的问题结构。 – spectras

+0

...如果你发现文件大小实际上是一个问题(可能是如果你在一个小系统上,使用libxml加载一个16MB文件通常会吃〜100MB),也许可以使用XmlTextReader API。 – spectras

回答

0

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


谢谢大家的帮助。