我正在尝试弄清楚如何使用lxml解析来自url的xml,以返回title属性的值。有没有人知道我哪里错了,或者什么会返回Title值/文本?所以在下面的例子中,我想返回'Weeds S05E05 - Van Nuys - HD TV‘的值
来自URL的XML:
<?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>打印出歌曲=
[]发布于 2012-11-28 23:54:25
首先,您实际上并没有在代码中使用lxml。您导入了lxml HTML解析器,但是忽略它,只使用标准库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)发布于 2012-11-28 23:56:12
整个问题在于,xml有一个xmlns属性,表示存在一个有效的subsonic-response名称空间。下面的代码考虑到了这一点,并正确地添加了歌曲标签。
import xml.etree.ElementTree as ET
root = ET.parse('test.xml').getroot()
print root.findall('{http://subsonic.org/restapi}song')发布于 2012-11-29 01:53:00
谢谢你们的帮助,我用了你们两个的组合来让它工作。
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']https://stackoverflow.com/questions/13608745
复制相似问题