2014-11-11 1 views
2

я открываю URL с помощью:ElementTree XML синтаксический анализ и urllib2.urlopen

response = urllib2.urlopen(url, data, timeout=_TIMEOUT) 

и используя response.read(), он дает следующий результат:

<XMLlookup licenseid="X4X6X42" reason="OK" status="1" /> 

, но когда я хочу, чтобы разобрать его с помощью ElementTree, например, так:

print response.read() 
t = ET.parse(response) 
r = t.getroot() 
print r.attrib.get('status') 

дает мне следующее сообщение об ошибке:

File "<string>", line 62, in parse 
File "<string>", line 38, in parse 
cElementTree.ParseError: no element found: line 1, column 0 

, но когда я удаляю строку response.read(), код работает нормально. Что я делаю не так?

ответ

3

Вы можете читать только один раз ответ, потому что это объект файла, как (на самом деле addinfourl). Последующие вызовы read возвращают пустую строку, поскольку вы всегда читали весь текст.

Так как вы не вызываете readET.parse(response) перед использованием, или сохранить результат в виде строки и использовать его для ET:

txt = response.read() 
# do what you want with txt (without changing it) 
t = ET.fromstring(txt) 
+0

благодарим вас за объяснение! поэтому, я должен сохранить результат к переменной, которая может содержать строку. что, если строка длинна-иш? – Francis

2

вместо

response.read() 
t = ET.parse(response) 
r = t.getroot() 

попробовать

resp = response.read() 
t = ET.fromstring(resp) 
r = t.getroot() 

или

t = ET.fromstring(response.read()) 
r = t.getroot() 

Кроме того, следует отметить, что не все HTML является интерпретируемым в XML. Если ваш запрос возвращает XHTML, тогда вы будете в порядке, но в противном случае вы получите очень похожую ошибку к тому, что вы видите.

+1

выход response.read() является текст - приведенный выше код не работает. – Francis

+1

Я исправил его, спасибо – iLoveTux

+0

Я запрашиваю скрипт CGI, который выводит только XML, поэтому я знаю, что он не собирается создавать HTML. – Francis

4

Вы должны использовать:

t = ET.fromstring(response.read())