-1

我在解析特定样式的 XML 时遇到了困难。

XML 文件如下所示:

<channels>
    <genre type = blah1>
        <channel name="Channel 1">
            <show>
                <title>hello</title>
            </show>
        </channel>
        <channel name="Channel 2">
            <show>
                <title>hello</title>
            </show>
        </channel>
    </genre>
    <genre type="blah2">
        <channel name="Channel 3">
            <show>
                <title>hello</title>
            </show>
        </channel>
    </genre>
</channels>

所以我的问题如下:

channelList = rootElem.find(".//channel[@name]")
howManyChannels = len(channelList)


for x in range(1, howManyChannels):
    print x
    print rootElem.find(".//channel[@name]["+str(x)+"]").get('name')
    for y in rootElem.find(".//channel[@name]["+str(x)+"]"):
        print y.findtext('title')

这进入通道 2,然后出现以下错误:

Traceback (most recent call last):
  File "parse.py", line 17, in <module>
    print rootElem.find(".//channel[@name]["+str(x)+"]").get('name')
AttributeError: 'NoneType' object has no attribute 'get'

为什么没有代码:

for y in rootElem.find(".//channel[@name]["+str(x)+"]"):

包括第 3 个频道,为什么它在另一个流派选项卡中被隔离?如何更改代码以适应这种情况?

我正在尝试将哪些频道与哪些节目一起存储在列表中。

更新:我不明白为什么

channelList = rootElem.find(".//channel[@name][3]")

即使在循环之外也会产生错误。

url = 'myxmlurl.com/xml.xml'
request = urllib2.Request(url, headers={"Accept" : "application/xml"})
u = urllib2.urlopen(request)
tree = ElementTree.parse(u)
rootElem = tree.getroot()
4

1 回答 1

0

首先,您发布的代码在语法上无效,因为它没有缩进。但是,问题的根源是您正在使用range.

代替:

channelList = rootElem.find(".//channel[@name]")
howManyChannels = len(channelList)


for x in range(1, howManyChannels):

做:

channelList = rootElem.find(".//channel[@name]")
for channel in channelList:
    pass #whatever

这样,您无需再次搜索频道。

此外,您的搜索“不起作用”,因为没有带有 name 的频道元素"3"。尝试搜索"Channel 3".

于 2013-08-27T19:29:46.753 回答