2013-01-04 43 views
-2

我从x_HFR3Hmv44 下载使用XML解析失败:xml.etree.cElementTree

wget -O example.xml http://gdata.youtube.com/feeds/api/videos?q=samsung+mobile&orderby=relevance&start-index=1&max-results=5&v=2 

我想要得到的视频ID的XML文件,例如,“x_HFR3Hmv44”,并从2010年10发布时间-25T20:42:22.000Z

不过,我没有使用下面的代码

import xml.etree.cElementTree as et 

sxml = open('example.xml', 'r').read() 
tree=et.fromstring(sxml) 
for el in tree.findall('published'): 
    print el.getchildren()[1].text 

但我失败了, 输出是什么

谁能告诉我我哪里错了?谢谢!

是不是因为xml文件不能被xml.etree.cElementTree处理? 有喜欢的标签,而YT未在文件中定义

+4

失败怎么办?您是否收到错误或追溯(如果包含,请附上)?你对这段代码有什么期待? –

+1

这甚至真的是你的实际代码?它有一个错字“exmaple.xml”(顺便说一下,我有一个有趣的心理图像,一个跨物种的前树) – Iguananaut

+1

这不能是你的代码。你的代码应该输出* nothing *,因为'el.getchildren()'是空的。 –

回答

1

你只是困惑的XML结构。将prettyprint=true添加到您的查询字符串以获取缩进xml,这将更容易阅读。另请咨询YouTube's element reference links了解期望的内容。

这将让你开始:

from urllib import urlopen 
import xml.etree.cElementTree as ET 

url = 'http://gdata.youtube.com/feeds/api/videos?q=samsung+mobile&orderby=relevance&start-index=1&max-results=5&v=2' 

root = ET.parse(urlopen(url)) 

def qname(prefix, name, map={'atom':'http://www.w3.org/2005/Atom'}): 
    """Helper function for namespaced element names""" 
    return '{{{}}}{}'.format(map[prefix], name) 


for e in root.findall(qname('atom','entry')): 
    print e.findtext(qname('atom','id')), e.findtext(qname('atom','published')) 
1

这很难说清楚,但我认为你有两个问题:

  1. Element.findall()只认定是该直接子元素元素,每the docs

  2. 您需要指定该标签所属的名称空间。例如:

    列表(tree.iter( '{} http://www.w3.org/2005/Atom发表'))

+0

非常感谢。如何找到命名空间?我注意到像http://www.w3.org/2005/Atom}published或http://search.yahoo.com/mrss/这样的命名空间,但我无法在xml文件中找到它们 – user1944267