2017-08-29 98 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


謝謝大家的幫助。