2013-04-20 5 views
1

Я очень новичок в языке сценариев python и недавно работал над парсером, который анализирует веб-файл xml.Не удается получить доступ к дочернему узлу при анализе XML с языком Python

Я могу извлечь все, кроме одного из элементов, используя minidom в python без проблем, однако у меня есть один узел, с которым у меня возникают проблемы. Последний узел, который я требую из файла XML является «URL» в теге «изображение», и это можно найти в следующем примере 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> 

Ниже я скопировал краткие разделы моего кода, который я чувство может иметь значение. Я очень ценю любую помощь с этим, чтобы получить этот последний узел URL-адреса изображения. Я также включу то, что я попробовал, и ошибку, которую я получил при запуске этого кода в 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) вместо мини-диска? –

+0

Этот URL-адрес возвращает ответ об ошибке для меня; Я получаю сообщение «Ошибка аутентификации». Возможно, вы тоже? –

+0

Привет @MartijnPieters, я оставил ключ api для этого примера, так же, как я думал, что это будет проще. Я могу вставить ключ api, если вы чувствуете, что это будет более полезно, но у меня нет проблем с этим, тем более доступ к элементам тега изображения. Мне пришлось декодировать и перекодировать данные xml после того, как он был проанализирован из-за проблемы с кодировкой с черной звездой, найденной в XML-данных. http://stackoverflow.com/questions/16026594/unicode-encoding-errors-python-parsing-xml-cant-encode-a-character-star/16073981?noredirect=1#16073981 – Karen

ответ

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 event элементов, которые имеют прямой элемент image ребенка.

Смежные вопросы