【问题标题】:Unable to Access Child Node in Parsing XML with Python Language使用 Python 语言解析 XML 时无法访问子节点
【发布时间】:2013-04-13 15:27:10
【问题描述】:

我对 python 脚本语言非常陌生,最近正在研究一个解析基于 Web 的 xml 文件的解析器。

我可以在 python 中使用 minidom 检索除一个元素以外的所有元素,没有任何问题,但是我有一个节点遇到问题。我从 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

【问题讨论】:

  • 不要对数据进行解码和重新编码!将解码留给 XML 解析器。有什么理由不能使用ElementTree API 代替 minidom?
  • 该 URL 为我返回错误响应;我收到一条Authentication Error 消息。也许你也这样做?
  • 嗨@MartijnPieters,我已经省略了这个例子的api键,因为我认为它会让它更简单。如果您觉得这会更有用,我可以插入 api 密钥,但是我对此没有任何问题,访问图像标签的元素更是如此。由于在 xml 数据中发现黑色星的编码问题,在解析 xml 数据后,我不得不对其进行解码和重新编码。 stackoverflow.com/questions/16026594/…
  • 这看起来不像是 XML 输入 的问题!你有 encoding Unicode 数据,错误不在于你的 XML。那里的问题很可能与print 状态有关,无论您当时的stdout 是什么。但是,如果没有无法进一步诊断的回溯。
  • 不需要API密钥,只需要覆盖所有的基础。

标签: python xml python-2.7


【解决方案1】:

首先,不要重新编码内容。没有必要这样做,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)

这仅考虑具有直接image 子元素的event 元素。

【讨论】:

    猜你喜欢
    • 2012-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多