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

0 投票
1 回答
3424 浏览
提问于 2025-04-17 13:45

我有一段代码是用来解析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

现在,如果我把'entry'从迭代中去掉,我得到的输出是这样的(为什么会有这个网址??):

{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'}

但是,如果我把迭代语句写成这样,它还是找不到'entry'的子元素:

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

我依然只得到'entry'这个元素,而不是它的子元素:

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

你们觉得我哪里做错了?

我到处搜索过,但就是搞不明白……我对这些都很陌生,所以如果是些傻问题请多包涵。

1 个回答

1

如果你在解析一个Atom源(就是一种数据格式),你真的应该使用feedparser,因为它会帮你处理所有这些细节,还有更多其他的事情。

{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

撰写回答