Python - 使用lxml返回title.text attrib的值

时间:2012-11-28 15:37:17

标签: python parsing lxml

我正在试图弄清楚如何使用lxml从url解析xml以返回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>

打印出歌曲=

[]

3 个答案:

答案 0 :(得分:3)

首先,您实际上并未在代码中使用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替换{*}通配符; .nsmap对象上的tree命名空间字典中提供了默认命名空间:

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

答案 1 :(得分: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')

答案 2 :(得分: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']