2013-08-27 86 views
-1

我在解析特定类型的XML时遇到困难。用Python解析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' 

为什么没有按't代码:

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() 
+0

缩进问题。如果您的代码没有正确缩进,我们无法对您的代码发表评论。 – Marcin

+0

请将代码格式化为代码。 – Marcin

回答

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 

这样,你不需要再为频道搜索。

此外,您的搜索“不起作用”,因为没有名称为"3"的通道元素。尝试搜索"Channel 3"

+0

好的,但将代码更改为上面的代码将不允许使用以下代码:print rootElem.find(“.// channel [@name] [”+ str(x)+“]”)。get('name')'因为x需要是一个数字而不是一个对象。对不起,缩进错误,这是我的错在最初的帖子,代码不反映这种方式。 – JavaWizKid

+0

@JavaWizKid你没有读过这一路?你不需要再次搜索频道,因为你就在那里。 – Marcin

+0

好的谢谢你的循环修复。如果我只是在循环外面使用'channelList = rootElem.find(“.// channel [@name] [3]”)'并且打印它会给出错误,那么这并不能解决问题。 – JavaWizKid