2012-11-28 57 views
2

我想弄清楚如何使用lxml解析xml從url來返回title屬性的值。有誰知道我有什麼錯,或者什麼會返回標題值/文本?因此,在下面的例子中我想返回的值從URLPython - 使用lxml返回title.text的值attrib

XML '雜草 - 高清電視S05E05 - - 範奈斯':

<?xml version="1.0" encoding="UTF-8"?> 
<subsonic-response xmlns="http://subsonic.org/restapi" status="ok" version="1.8.0"> 
<song id="11345" parent="11287" title="Weeds - S05E05 - Van Nuys - HD TV" album="Season 5" artist="Weeds" isDir="false" created="2009-07-06T22:21:16" duration="1638" bitRate="384" size="782304110" suffix="mkv" contentType="video/x-matroska" isVideo="true" path="Weeds/Season 5/Weeds - S05E05 - Van Nuys - HD TV.mkv" transcodedSuffix="flv" transcodedContentType="video/x-flv"/> 
</subsonic-response> 

我當前的Python代碼:

import lxml 
from lxml import html 
from urllib2 import urlopen 

url = 'https://myurl.com' 

tree = html.parse(urlopen(url)) 
songs = tree.findall('{*}song') 
for song in songs: 
    print song.attrib['title'] 

通過上面的代碼,我沒有獲得數據返回,有什麼想法?

打印出樹=

<lxml.etree._ElementTree object at 0x0000000003348F48> 

打印出來的歌曲=所有的

[] 
+3

您沒有使用'lxml'功能。只有標準庫'ElementTree'實現在你的例子中實際上正在工作。可以安全地從代碼中刪除'import lxml.html as lh'。 –

+0

我已經嘗試過內置的ElementTree,但永遠無法讓它工作,所以我想我會嘗試lxml。只是無法弄清楚如何編寫正確的代碼。 – nutt318

回答

3

首先,你實際上並沒有在代碼中使用lxml。您導入lxmlHTML解析器,但忽略它,只改用標準庫xml.etree.ElementTree module

其次,您搜索data/song,但在文檔中沒有任何data元素,因此不會找到匹配項。最後但並非最不重要的是,你有一個使用名稱空間的文檔。搜索元素時必須包含這些元素,或者使用通配符搜索進行{*}

下找到的歌曲給你:

from lxml import etree 

tree = etree.parse(URL) # lxml can load URLs for you 
songs = tree.findall('{*}song') 
for song in songs: 
    print song.attrib['title'] 

使用顯式的命名空間,你就必須更換{*}通配符與完整的命名空間URL;默認的命名空間中tree對象的.nsmap命名空間字典可用:

namespace = tree.nsmap[None] 
songs = tree.findall('{%s}song' % namespace) 
+0

'進口LXML 從LXML進口etree URL = 'https://myurl.com' 樹= lxml.parse(URL)#LXML可以加載網址爲您 歌曲= tree.findall('{*}歌曲') 歌曲中的歌曲: print song.attrib ['title']' 獲取錯誤:AttributeError:'模塊'對象沒有屬性'解析' – nutt318

+0

'etree.parse',抱歉。 –

+0

得到錯誤:' 樹=調用etree.parse(URL) 文件 「parser.pxi」,線1002,在lxml.etree._BaseParser._parseDocFromFile(SRC/LXML \ lxml.etree.c:78623) 文件「 (src/lxml \ lxml.etree.c:74567) 文件「parser.pxi」,第650行,位於lxml.etree._handleParseResult(src/lxml) \ lxml.etree.c:75458) lxml.etree._raiseParseError(src/lxml \ lxml.etree.c:74760)中的文件「parser.pxi」,第588行 IOError:讀取文件'https:// myurl.com':未能加載外部實體「https://myurl.com」' – nutt318

0

整個問題是與該subsonic-response標籤具有xmlns屬性表明存在實際上是一個XML命名空間的事實。下面的代碼會考慮到這一點,並正確地將歌曲標籤放在一起。

import xml.etree.ElementTree as ET 
root = ET.parse('test.xml').getroot() 
print root.findall('{http://subsonic.org/restapi}song') 
0

感謝您的幫助,我使用了兩者的組合來使它工作。

import xml.etree.ElementTree as ET 
from urllib2 import urlopen 

url = 'https://myurl.com' 
root = ET.parse(urlopen(url)).getroot() 
for song in root: 
    print song.attrib['title'] 
+0

但是,當我把它放入一個變量中時,它將刪除空格,關於如何保留空格的任何想法? – nutt318