2014-02-18 45 views
2

我不知道爲什麼這個工程:解析相同的內容兩次lxml.iterparse

​​

哪裏,這並不工作:

content = urllib2.urlopen(url) 

context = etree.iterparse(content, tag='{my_ns}my_first_tag') 
context = iter(context) 
for event, elem in context: 
    pass 

context = etree.iterparse(content, tag='{my_ns}my_second_tag') 
for event, elem in context: 
    pass 

,並給了我這個錯誤:

XMLSyntaxError: Extra content at the end of the document, line 1, column 1 

我可以不分析兩次相同的內容嗎?奇怪的是,當我只是評論循環而不是整個iterparse命令時它正在工作。

我是否錯過了關閉的東西?

非常感謝

回答

3

urllib2.urlopen爲您提供了一個類文件對象,你可以用它來閱讀你查詢URL的內容。

我在這裏猜測etree.iterparse返回一個對象,可以迭代,但根本不觸碰content,直到那時。在這種情況下,第一個循環使用context遍歷content的內容,「消耗」數據。

當您創建第二個context時,您傳遞的是相同的content,到那時爲空。

編輯:你問的方式來重新分析...一會讀出整個數據,然後分別傳遞到使用StringIO的類文件對象中的每個iterparse通話。例如。

from StringIO import StringIO 

# ... 

data = content.read() 
context = etree.iterparse(StringIO(data), tag='{my_ns}my_first_tag') 
# processing... 
context = etree.iterparse(StringIO(data), tag='{my_ns}my_second_tag') 
# processing... 
+0

謝謝里卡多!也許你知道如何重新設置內容而不用再次使用urlopen?最好的辦法是在iterparse命令中指定多個標籤,但我無法弄清楚如何去做。再次感謝。 – user3173237

+0

這種方式工作正常。謝謝。 – user3173237