2014-02-18 1 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 

, где это не работает:

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, который к тому времени «пуст».

Редактировать: как вы запрашиваете способы повторной обработки ... Можно было бы прочитать все данные, а затем передать их отдельно каждому вызову iterparse, используя StringIO в качестве файлового объекта. Например.

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

Thanks Ricardo! Может быть, вы знаете, как сбросить содержимое, не делая снова urlopen? Лучше всего указать более одного тега в команде iterparse, но я не могу понять, как это сделать. Еще раз спасибо. – user3173237

+0

Этот способ работает нормально. Благодарю. – user3173237