2012-05-30 4 views
1

мой XML-код принес через сеть выглядит такXML разбора в питона

<?xml version='1.0' ?><liverequestresponse><liverequesttime>180</liverequesttime><livemessage></livemessage></liverequestresponse> 

и мой питона код minidom является

import urllib, urllib2, time 
from xml.dom.minidom import parse 
response = urllib2.urlopen(req) 
the_page = response.read() 
#print the_page 
dom = parse(response) 
name = dom.getElementsByTagNameNS('liverequestresponse') 
print name[0].nodeValue 

дает некоторые ошибки

print the_page 

работает отлично

Или, если они являются любыми другими библиотеки, которые лучше, чем minidom, плз скажите мне .. я предпочел бы тот, который поставляется с предварительно установленной на Linux

UPDATE

ошибки

Traceback (most recent call last): 
    File "logout.py", line 18, in <module> 
    dom = parse(response) 
    File "/usr/lib64/python2.7/xml/dom/minidom.py", line 1920, in parse 
    return expatbuilder.parse(file) 
    File "/usr/lib64/python2.7/xml/dom/expatbuilder.py", line 928, in parse 
    result = builder.parseFile(file) 
    File "/usr/lib64/python2.7/xml/dom/expatbuilder.py", line 211, in parseFile 
    parser.Parse("", True) 
xml.parsers.expat.ExpatError: no element found: line 1, column 0 
+0

... а ошибки есть? – Hamish

+0

updated plz check – pahnin

ответ

3

если вы используете response.read до parse(response) вы уже прочитали содержание ответа. второй вызов response.read (что делает parse) приведет к пустой строке.

Самое простое решение - просто отказаться от первого вызова response.read. Но если вам действительно нужно строку ответа на какой-то причине, вы можете попробовать:

import urllib, urllib2, time 
import StringIO 
from xml.dom.minidom import parse 
response = urllib2.urlopen(req) 
the_page = response.read() 
#print the_page 
dom = parse(StringIO.StringIO(the_page)) 
name = dom.getElementsByTagName('liverequesttime') 
text = name[0].firstChild 
print text.nodeValue 
+0

он ничего не печатает! Я попытался отбросить response.read тоже .. его не так важно, поэтому я прокомментировал его и запустил скрипт outout was no – pahnin

+0

он печатает 'None', потому что узел' liverequestresponse' не имеет значения , Он содержит только дочерний узел, который содержит текстовый узел, который имеет значение. 'minidom' - не самая удобная XML-библиотека синтаксического анализа. 'lxml' лучше, или же' xml.etree' лучше. – mata

+0

Это сработало, я пробовал с 'childnode', но это не сработало! Спасибо – pahnin

1

Подход с lxml, который в настоящее время очень используется в Python в последнее время для разбора XML с очень хорошими результатами и эффективностью деятельности:

import urllib2 
from lxml import etree 

with urllib2.urlopen(req) as f: 
    xml = etree.parse(f) 

xml.find('.//liverequesttime').text 

Выходной сигнал последней строки будет: 180

+0

lxml должен быть установлен, есть ли встроенные библиотеки, которые лучше, чем мини-мини? – pahnin

+0

lxml необходимо установить, но он предварительно упакован во множество дистрибутивов Linux, хотя вы всегда можете установить его с помощью 'easy_install' –

+0

. Я не хочу рисковать. Я пишу клиент для входа в http для минималистичного Linux, я возможно, придется использовать это на ядре Arch linux – pahnin