繁体   English   中英

Python 3.4-XML解析-IndexError:列表索引超出范围-如何找到XML范围?

[英]Python 3.4 - XML Parse - IndexError: List Index Out of Range - How do I find range of XML?

好的,伙计们,我是解析XML和Python的新手,并且正在尝试使其工作。 如果有人可以帮助我,将不胜感激。 如果您可以帮助我(教育我)如何自己解决问题,那就更好了!

我无法找出XML文档的引用范围,因为我找不到任何文档。 这是我的代码,之后将包括整个Traceback。

#import library to do http requests:
import urllib.request

#import easy to use xml parser called minidom:
from xml.dom.minidom import parseString
#all these imports are standard on most modern python implementations

#download the file:
file = urllib.request.urlopen('http://www.wizards.com/dndinsider/compendium/CompendiumSearch.asmx/KeywordSearch?Keywords=healing%20%word&nameOnly=True&tab=')
#convert to string:
data = file.read()
#close file because we dont need it anymore:
file.close()
#parse the xml you downloaded
dom = parseString(data)
#retrieve the first xml tag (<tag>data</tag>) that the parser finds with name tagName:
xmlTag = dom.getElementsByTagName('Data.Results.Power.ID')[0].toxml()
#strip off the tag (<tag>data</tag>  --->   data):
xmlData=xmlTag.replace('<id>','').replace('</id>','')
#print out the xml tag and data in this format: <tag>data</tag>
print(xmlTag)
#just print the data
print(xmlData)

追溯

/usr/bin/python3.4 /home/mint/PycharmProjects/DnD_Project/Power_Name.py
Traceback (most recent call last):
  File "/home/mint/PycharmProjects/DnD_Project/Power_Name.py", line 14, in <module>
xmlTag = dom.getElementsByTagName('id')[0].toxml()
IndexError: list index out of range

流程以退出代码1完成

print len( dom.getElementsByTagName('id') )

编辑:

ids = dom.getElementsByTagName('id')

if len( ids ) > 0 :
     xmlTag = ids[0].toxml()
     # rest of code

编辑:我添加示例,因为我在其他评论中看到了,你不知道如何使用它

顺便说一句:我在代码中添加了一些有关文件/连接的注释

import urllib.request

from xml.dom.minidom import parseString

# create connection to data/file on server
connection = urllib.request.urlopen('http://www.wizards.com/dndinsider/compendium/CompendiumSearch.asmx/KeywordSearch?Keywords=healing%20%word&nameOnly=True&tab=')

# read from server as string (not "convert" to string):
data = connection.read()

#close connection because we dont need it anymore:
connection.close()

dom = parseString(data)

# get tags from dom
ids = dom.getElementsByTagName('Data.Results.Power.ID')

# check if there are any data
if len( ids ) > 0 :
    xmlTag = ids[0].toxml()
    xmlData=xmlTag.replace('<id>','').replace('</id>','')
    print(xmlTag)
    print(xmlData)
else:
    print("Sorry, there was no data")

或者如果有更多标签,可以使用for循环

dom = parseString(data)

# get tags from dom
ids = dom.getElementsByTagName('Data.Results.Power.ID')

# get all tags - one by one
for one_tag in ids:
    xmlTag = one_tag.toxml()
    xmlData = xmlTag.replace('<id>','').replace('</id>','')
    print(xmlTag)
    print(xmlData)

BTW:

  • getElementsByTagName()需要标记名ID而不是路径Data.Results.Power.ID
  • 标记名是ID因此您必须替换<ID>而不是<id>
  • 对于此标签,您可以事件使用one_tag.firstChild.nodeValue代替xmlTag.replace

dom = parseString(data)

# get tags from dom
ids = dom.getElementsByTagName('ID') # tagname

# get all tags - one by one
for one_tag in ids:
    xmlTag = one_tag.toxml()
    #xmlData = xmlTag.replace('<ID>','').replace('</ID>','')
    xmlData = one_tag.firstChild.nodeValue
    print(xmlTag)
    print(xmlData)

我已经有一段时间没有使用内置的xml库了,但是Mark Pilgrim的Dive into Python一书中对此进行了介绍。

-我输入的内容表明您的问题已经得到解答,但是由于您提到了Python的新知识,所以我认为您会发现该文本对于xml解析很有用,并且是该语言的绝佳介绍。

如果您想尝试另一种解析xml和html的方法,我强烈建议使用lxml

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM