Python:可以使用elementTree迭代子元素

时间:2013-01-26 16:01:55

标签: python xml iterator elementtree

我有以下代码来解析XML,但它不会让我遍历子代:

import urllib, urllib2, re, time, os
import xml.etree.ElementTree as ET 

def wgetUrl(target):
    try:
        req = urllib2.Request(target)
        req.add_header('User-Agent', 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.0.3 Gecko/2008092417 Firefox/3.0.3')
        response = urllib2.urlopen(req)
        outtxt = response.read()
        response.close()
    except:
        return ''
    return outtxt

newUrl = 'http://feeds.rasset.ie/rteavgen/player/playlist?showId=10056467'

data = wgetUrl(newUrl)
tree = ET.fromstring(data)
#tree = ET.parse(data)
for elem in tree.iter('entry'):
    print elem.tag, elem.attrib

现在,如果我从iter中删除'entry',我会得到一个这样的输出(为什么是URL?):

{http://www.w3.org/2005/Atom}entry {}
{http://www.w3.org/2005/Atom}id {}
{http://www.w3.org/2005/Atom}published {}
{http://www.w3.org/2005/Atom}updated {}
{http://www.w3.org/2005/Atom}title {'type': 'text'}

但是,如果我把这样的iter语句仍然没有找到要输入的子项:

for elem in tree.iter('{http://www.w3.org/2005/Atom}entry'):
    print elem.tag, elem.attrib

我仍然只能获得自己的入口元素,而不是孩子:

{http://www.w3.org/2005/Atom}entry {}

知道我做错了什么吗?

我到处都搜索过,但是无法弄明白......我是新手,所以如果这是愚蠢的话,我很抱歉。

1 个答案:

答案 0 :(得分:1)

如果您正在解析Atom供稿,那么确实想要使用feedparser library,而是为您处理所有这些细节。

{http://www.w3.org/2005/Atom}部分是命名空间。您需要指定该命名空间以选择entry标记:

for elem in tree.iterfind('ns:entry', {'ns': 'http://www.w3.org/2005/Atom'}):

我使用字典将ns:前缀映射到命名空间,或者您可以使用相同的花括号语法:

for elem in tree.iterfind('{http://www.w3.org/2005/Atom}entry'):

一旦你拥有了元素,你仍然需要明确地找到它的孩子:

for elem in tree.iterfind('{http://www.w3.org/2005/Atom}entry'):
    for child in elem:
        print child