2013-04-20 91 views
1

我对python脚本语言非常陌生,最近正在研究解析基于web的xml文件的解析器。在用Python语言解析XML时无法访问子节点

我能够检索所有使用Python中的minidom但没有问题的元素之一,但我有一个节点,我遇到了麻烦。我从XML文件所需要的最后一个节点是“图像”标签中的“网址”,这可以在下面的XML文件示例中找到:

<events> 
    <event id="abcde01"> 
     <title> Name of event </title> 
     <url> The URL of the Event <- the url tag I do not need </url> 
     <image> 
      <url> THE URL I DO NEED </url> 
     </image> 
    </event> 

下面我抄我的代码简短的部分,我感觉可能是相关的。我真的很感谢任何帮助,以检索这最后的图像网址节点。我还将包括我尝试过的以及在GAE中运行此代码时收到的错误。我使用的Python版本是Python 2.7,我也许应该指出,我将它们保存在数组中(以便以后输入到数据库中)。

class XMLParser(webapp2.RequestHandler): 
def get(self): 
     base_url = 'http://api.eventful.com/rest/events/search?location=Dublin&date=Today' 
     #downloads data from xml file: 
     response = urllib.urlopen(base_url) 
     #converts data to string 
     data = response.read() 
     unicode_data = data.decode('utf-8') 
     data = unicode_data.encode('ascii','ignore') 
     #closes file 
     response.close() 
     #parses xml downloaded 
     dom = mdom.parseString(data)   
     node = dom.documentElement #needed for declaration of variable 
     #print out all event names (titles) found in the eventful xml 
     event_main = dom.getElementsByTagName('event') 

     #URLs list parsing - MY ATTEMPT - 
     urls_list = [] 
     for im in event_main: 
      image_url = image.getElementsByTagName("image")[0].childNodes[0] 
      urls_list.append(image_url) 

错误我收到的是以下任何的帮助深表感谢,卡伦

image_url = im.getElementsByTagName("image")[0].childNodes[0] 
IndexError: list index out of range 
+0

不要对数据进行解码和重新编码!将解码保留到XML解析器。任何你不能使用[ElementTree API](http://docs.python.org/2/library/xml.etree.elementtree.html)而不是minidom的理由? – 2013-04-20 08:08:30

+0

该URL会为我返回错误响应;我收到一个'Authentication Error'消息。也许你也这样做? – 2013-04-20 08:11:07

+0

嗨@MartijnPieters,我已经遗漏了这个例子的API key,就像我认为它会使它更简单一样。如果你觉得这样会更有用,我可以插入api键,但是我没有问题,它更像是访问图像标签的元素。由于xml数据中发现的黑星的编码问题,我必须解码并重新编码xml数据。 http://stackoverflow.com/questions/16026594/unicode-encoding-errors-python-parsing-xml-cant-encode-a-character-star/16073981?noredirect=1#16073981 – Karen 2013-04-20 09:25:18

回答

0

首先,做重新编码的内容。没有必要这样做,XML解析器完全能够处理编码的内容。

接下来,我会用ElementTree API像这样的任务:

from xml.etree import ElementTree as ET 

response = urllib.urlopen(base_url) 
tree = ET.parse(response) 

urls_list = [] 
for event in tree.findall('.//event[image]'): 
    # find the text content of the first <image><url> tag combination: 
    image_url = event.find('.//image/url') 
    if image_url is not None: 
     urls_list.append(image_url.text) 

这只consideres有直接image子元素event元素。