当前位置: 首页 > 面试题库 >

用Python处理XML真的很简单吗?

祖迪
2023-03-14
问题内容

如果我举个例子,也许我能最好地解释:假设以下内容-我认为这是XML在Web服务中(错误)使用的一个很好的例子-
是我从http请求到http://www.google的响应.com
/ ig / api?weather = 94043

<xml_api_reply version="1">
  <weather module_id="0" tab_id="0" mobile_row="0" mobile_zipped="1" row="0" section="0" >
    <forecast_information>
      <city data="Mountain View, CA"/>
      <postal_code data="94043"/>
      <latitude_e6 data=""/>
      <longitude_e6 data=""/>
      <forecast_date data="2010-06-23"/>
      <current_date_time data="2010-06-24 00:02:54 +0000"/>
      <unit_system data="US"/>
    </forecast_information>
    <current_conditions>
      <condition data="Sunny"/>
      <temp_f data="68"/>
      <temp_c data="20"/>
      <humidity data="Humidity: 61%"/>
      <icon data="/ig/images/weather/sunny.gif"/>
      <wind_condition data="Wind: NW at 19 mph"/>
    </current_conditions>
    ...
    <forecast_conditions>
      <day_of_week data="Sat"/>
      <low data="59"/>
      <high data="75"/>
      <icon data="/ig/images/weather/partly_cloudy.gif"/>
      <condition data="Partly Cloudy"/>
    </forecast_conditions>
  </weather>
</xml_api_reply>

加载/解析此类文档后,我希望能够像说的那样简单地访问信息

>>> xml['xml_api_reply']['weather']['forecast_information']['city'].data
'Mountain View, CA'

要么

>>> xml.xml_api_reply.weather.current_conditions.temp_f['data']
'68'

从我到目前为止所看到的,这似乎ElementTree是最接近我梦想的。但这还不存在,使用XML时仍然有些麻烦。OTOH,我想的并不是那么复杂-
可能只是解析器之上的薄薄的单板-但这可以减少处理XML的烦恼。有这样的魔术吗?(如果没有,为什么?)

PS。请注意,我已经尝试过BeautifulSoup了,尽管我喜欢它的方法,但是它存在空<element/>s的实际问题-请参阅以下注释中的示例。


问题答案:

您想要薄木皮吗?这很容易煮。尝试以下围绕ElementTree的琐碎包装器作为起点:

# geetree.py
import xml.etree.ElementTree as ET

class GeeElem(object):
    """Wrapper around an ElementTree element. a['foo'] gets the
       attribute foo, a.foo gets the first subelement foo."""
    def __init__(self, elem):
        self.etElem = elem

    def __getitem__(self, name):
        res = self._getattr(name)
        if res is None:
            raise AttributeError, "No attribute named '%s'" % name
        return res

    def __getattr__(self, name):
        res = self._getelem(name)
        if res is None:
            raise IndexError, "No element named '%s'" % name
        return res

    def _getelem(self, name):
        res = self.etElem.find(name)
        if res is None:
            return None
        return GeeElem(res)

    def _getattr(self, name):
        return self.etElem.get(name)

class GeeTree(object):
    "Wrapper around an ElementTree."
    def __init__(self, fname):
        self.doc = ET.parse(fname)

    def __getattr__(self, name):
        if self.doc.getroot().tag != name:
            raise IndexError, "No element named '%s'" % name
        return GeeElem(self.doc.getroot())

    def getroot(self):
        return self.doc.getroot()

您可以这样调用它:

>>> import geetree
>>> t = geetree.GeeTree('foo.xml')
>>> t.xml_api_reply.weather.forecast_information.city['data']
'Mountain View, CA'
>>> t.xml_api_reply.weather.current_conditions.temp_f['data']
'68'


 类似资料:
  • 问题内容: 我到处都看过,发现有数百万个python代理服务器,但是没有一个服务器可以完全满足我的要求(我认为:s) 一般而言,我在python方面有很多经验,但是对于HTTP协议深层的秘密我还是很陌生。 我认为可能有用的是可以连接到一个非常简单的代理示例,然后将自己尝试连接到传递给它的地址。 另外,我认为让隐藏的东西正在做的事情让我感到困惑,例如,如果该类继承自BaseHTTPServer.Ba

  • 问题内容: 我正在尝试从Flickr中读取RSS提要,但它具有一些不能被Simple XML读取的节点(,等等)。 我该如何解决?当我查看DOM文档时,我的头很痛。所以我想避免这种情况,因为我不想学习。 我正在尝试获取缩略图。 问题答案: 解决方案在这篇不错的文章中进行了解释。您需要用于访问包含名称空间的XML元素的方法。此代码段摘自该文章:

  • 在使用swift教程时,我开始编写一个自定义的方法来检查给定的是否为素数。 在编写完它之后,我意识到它工作正常,但发现在一些相当大的数字上执行有点慢(仍然比)。 所以我用objc编写了相同的代码,并且代码的执行速度快得多(是66倍)。 以下是swift代码: 和对象代码: 在中: 这就产生了:

  • 本文向大家介绍python简单文本处理的方法,包括了python简单文本处理的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了python简单文本处理的方法。分享给大家供大家参考。具体如下: 由于有多线程的影响,c++项目打印出来的时间顺序不一致,导致不太好在excel中统计,故使用python写了段脚本来解决之。涉及到如下方面 1. txt文本的读取,utf8的处理 2. 字符串的基

  • 本文向大家介绍使用Python处理Excel表格的简单方法,包括了使用Python处理Excel表格的简单方法的使用技巧和注意事项,需要的朋友参考一下 Excel 中的每一个单元,都会有这些属性:颜色(colors)、number formatting、字体(fonts)、边界(borders)、alignment、模式(patterns) 等等。 xlsxwriter 格式处理,将待添加数据转换

  • 本文向大家介绍Python简单日志处理类分享,包括了Python简单日志处理类分享的使用技巧和注意事项,需要的朋友参考一下 简单的一个python日志处理类