簡體   English   中英

使用Python lxml和Iterparse解析大型XML文件

[英]Parsing Large XML file with Python lxml and Iterparse

我試圖使用lxml和iterparse方法編寫一個解析器,以逐步瀏覽包含許多項目的非常大的xml文件。

我的文件格式為:

<item>
  <title>Item 1</title>
  <desc>Description 1</desc>
  <url>
     <item>http://www.url1.com</item>
  </url>
</item>
<item>
  <title>Item 2</title>
  <desc>Description 2</desc>
  <url>
     <item>http://www.url2.com</item>
  </url>
</item>

到目前為止,我的解決方案是:

from lxml import etree

context = etree.iterparse( MYFILE, tag='item' )

for event, elem in context :
      print elem.xpath( 'description/text( )' )
      elem.clear( )
      while elem.getprevious( ) is not None :
            del elem.getparent( )[0]

del context

當我運行它時,我得到類似於以下內容:

[]
['description1']
[]
['description2']

空集是因為它還將子項的item標記拉出到url標記中,並且顯然沒有使用xpath提取的描述字段。 我的希望是逐項分析每個項目,然后根據需要處理子字段。 我只是在學習lxml庫,所以我很好奇是否有一種方法可以提取主要項目,而如果遇到任何子項目,則不進行任何設置?

無論如何,整個XML都是由核心實現解析的。 etree.iterparse只是生成器樣式的視圖,它提供了按標記名稱的簡單過濾(請參閱docstring http://lxml.de/api/lxml.etree.iterparse-class.html )。 如果您想進行復雜的過濾,則應自己完成。

一個解決方案:還注冊啟動事件:

iterparse(self, source, events=("start", "end",), tag="item")

並知道您何時處於“ item”端,何時處於“ item / url / item”端。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM