Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:可以使用elementTree迭代子元素_Python_Xml_Iterator_Elementtree - Fatal编程技术网

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

Python:可以使用elementTree迭代子元素,python,xml,iterator,elementtree,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-

我有以下代码来解析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
{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
现在,如果我从iter中删除“条目”,我会得到如下输出(为什么是URL??):

但是,如果我把国际热核实验堆的声明放在这里,它仍然没有找到要进入的孩子:

for elem in tree.iter('{http://www.w3.org/2005/Atom}entry'):
    print elem.tag, elem.attrib
我仍然只获得entry元素本身,而不是子元素:

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
{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
知道我做错了什么吗


我到处都找过了,但都找不到这个。。。我对这一切都是陌生的,如果这是一件愚蠢的事情,我很抱歉。

如果你正在解析Atom提要,你真的想改用,它会为你和更多人处理所有这些细节

{http://www.w3.org/2005/Atom}
part是一个名称空间。您需要指定该名称空间来选择
条目
标记:

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'):
拥有元素后,仍然需要显式查找其子元素:

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

即使我在tree.iterfind('{}entry'):print elem.tag,elem.attrib中使用elem,它仍然不会向下迭代到子元素,例如(,,等等)。知道为什么吗?@user1995132:是的,你只是在搜索
条目
,然后就找不到孩子了。您要求的是
entry
标记,而不是
id
published
updated
title
标记。即使使用tree.iter({}entry'),它也不起作用,所以当我看到您的示例时,我尝试了iterfind,但结果相同。@user1995132:刚刚针对该提要进行了测试,我发现了一个元素
iterfind()
很好。@user1995132:我提到过使用
feedparser
会更容易吗?