首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python -使用lxml返回title.text属性的值

Python -使用lxml返回title.text属性的值
EN

Stack Overflow用户
提问于 2012-11-28 23:37:17
回答 3查看 892关注 0票数 2

我正在尝试弄清楚如何使用lxml解析来自url的xml,以返回title属性的值。有没有人知道我哪里错了,或者什么会返回Title值/文本?所以在下面的例子中,我想返回'Weeds S05E05 - Van Nuys - HD TV‘的值

来自URL的XML:

代码语言:javascript
复制
<?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代码:

代码语言:javascript
复制
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']

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

打印出树=

代码语言:javascript
复制
<lxml.etree._ElementTree object at 0x0000000003348F48>

打印出歌曲=

代码语言:javascript
复制
[]
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-11-28 23:54:25

首先,您实际上并没有在代码中使用lxml。您导入了lxml HTML解析器,但是忽略它,只使用标准库xml.etree.ElementTree module

其次,您搜索data/song,但文档中没有任何data元素,因此将找不到匹配的内容。最后但并非最不重要的一点是,这里有一个使用名称空间的文档。在搜索元素时,或者使用{*}通配符搜索时,必须包括这些内容。

下面将为您查找歌曲:

代码语言:javascript
复制
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名称空间字典中可用:

代码语言:javascript
复制
namespace = tree.nsmap[None]
songs = tree.findall('{%s}song' % namespace)
票数 3
EN

Stack Overflow用户

发布于 2012-11-28 23:56:12

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

代码语言:javascript
复制
import xml.etree.ElementTree as ET
root = ET.parse('test.xml').getroot()
print root.findall('{http://subsonic.org/restapi}song')
票数 0
EN

Stack Overflow用户

发布于 2012-11-29 01:53:00

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

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13608745

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档