2013-04-05 111 views
1

以下內容似乎沒有正確解析xml數據或者做錯了什麼。XML錯誤對象沒有屬性'cssselect'

這是正在運行的代碼。

從LXML進口etree

從lxml.etree進口fromstring

if request.POST: 

    xml = request.POST['xml'].encode('utf-8') 
    parser = etree.XMLParser(ns_clean=True, recover=True, encoding='utf-8') 
    h = fromstring(xml, parser=parser) 
    status = h.cssselect('itagg_delivery_receipt status').text_content() 
    return HttpResponse(status) 

錯誤:

AttributeError的: 'lxml.etree._Element' 對象有沒有屬性 'cssselect' 狀態

這是正在發送的xml文檔:

<?xml version="1.1" encoding="ISO-8859-1"?> 
<itagg_delivery_receipt> 
<version>1.0</version> 
<msisdn>447889000000</msisdn> 
<submission_ref> 
845tgrgsehg394g3hdfhhh56445y7ts6</ 
submission_ref> 
<status>Delivered</status> 
<reason>4</reason> 
<timestamp>20050709120945</timestamp> 
<retry>0</retry> 
</itagg_delivery_receipt> 

我已經傾倒了STR(h)和它看起來像這樣<element 0x7fd341e93870="" at="" itagg_delivery_receipt=""></element>

+0

我不認爲你可以在xml文檔上使用cssselect。如果你從lxml.html導入,你會得到cssselect,但我不知道這是否適合你的XML文件。 – leech 2013-06-20 16:51:31

回答

0

下面是如何得到你想要與xpath的東西:

>>> h.xpath('status/text()') 
['Delivered'] 
與代碼中的小助手功能

所以:

def first(seq,default=None): 
    for item in seq: 
    return item 
    return default 

... 

status = first(h.xpath('status/text()')) 
0

使用cssselect之前,你需要安裝它

pip install cssselect 
+0

OP使用的'lxml'庫中有一個cssselect模塊。 – MattH 2013-04-05 11:16:35

+0

@MattH只需從lxml重新讀取'csssellect.py'並找到「這是一個圍繞cssselect 0.7或更高版本的薄包裝。」 – nk9 2013-04-05 11:23:57

+0

@MattH lxml通過刪除其內置的cssselect並使用外部選項添加了另一個障礙(有一個驚喜..),這意味着您必須單獨安裝它 – Amalgovinus 2014-11-30 23:19:11

相關問題