2012-05-30 203 views
1

我的XML代碼的網絡弄來了看起來像這樣XML在python解析

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

和我的Python 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命名更好的庫,PLZ告訴我.. 我寧願它是預安裝在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

更新PLZ檢查 – pahnin

回答

3

如果使用response.read的一個在parse(response)之前,您已經閱讀了回覆的內容。第二次調用response.readparse正在執行)將導致一個空字符串。

最簡單的解決方案是放棄第一個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太..它不那麼重要,所以我評論它,並運行腳本輸出沒有 – 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有沒有比minidom更好的內置庫? – pahnin

+0

lxml需要安裝,但它已經預先打包在很多linux發行版上,儘管你總是可以用'easy_install'安裝它。 –

+0

我不想冒險寫我爲簡約linux寫的http登錄客戶機,我可能必須在Arch linux核心上使用它 – pahnin