Python使用lxml返回标题。文本属性

2024-05-14 15:10:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试如何使用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代码:

^{pr2}$

用上面的代码我没有得到数据返回,有什么想法吗?在

从树中打印=

<lxml.etree._ElementTree object at 0x0000000003348F48>

打印出的歌曲=

[]

Tags: titleversionresponsevideoxmltvvanlxml
3条回答

整个问题在于subsonic-response标记有一个xmlns属性,表示存在有效的xml命名空间。下面的代码考虑到了这一点,并正确地收集了歌曲标签。在

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

首先,您实际上并没有在代码中使用lxml。导入lxmlHTML解析器,但是忽略它,只使用标准库^{} 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命名空间dict中找到:

^{pr2}$

谢谢你们的帮助,我用了你们两个的组合让它工作起来。在

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']

相关问题 更多 >

    热门问题