2016-02-11 180 views
1

我用lxml解析格式良好的XML:解析XML與空命名空間

<search-results xmlns="http://www.w3.org/2005/Atom" 
       xmlns:atom="http://www.w3.org/2005/Atom" 
       xmlns:prism="http://prismstandard.org/namespaces/basic/2.0/" 
       xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/" 
       xmlns:dc="http://purl.org/dc/elements/1.1/"> 
    <opensearch:totalResults>0</opensearch:totalResults> 
    <opensearch:startIndex>0</opensearch:startIndex> 
    <opensearch:itemsPerPage>0</opensearch:itemsPerPage> 
    <entry> 
     <error>Result set was empty</error> 
    </entry> 
</search-results> 

我很感興趣,裏面的文字error

我用下面的代碼:

from lxml import etree 

doc = etree.fromstring(xml) # xml is above xml 

ns = {'opensearch': "http://a9.com/-/spec/opensearch/1.1/"} 
print doc.xpath('//opensearch:totalResults', namespaces=ns)[0].text 

的正常工作得到0,但我應該爲<entry>做的,這似乎並不在一個命名空間?我嘗試添加空的命名空間,我認爲這是與"http://www.w3.org/2005/Atom"相關:

ns = {'opensearch': "http://a9.com/-/spec/opensearch/1.1/", 'empty': "http://www.w3.org/2005/Atom"} 
print doc.xpath('//entry/error', namespaces=ns)[0].text 

但是這會導致一個IndexError,因爲沒有列表。

回答

1

您需要使用empty別名你給的表達式中的空命名空間:

ns = {'opensearch': "http://a9.com/-/spec/opensearch/1.1/", 'empty': "http://www.w3.org/2005/Atom"} 
print doc.xpath('//empty:entry/empty:error', namespaces=ns)[0].text