【问题标题】:Parsing XML via 'ElementTree' in Python在 Python 中通过“ElementTree”解析 XML
【发布时间】:2020-02-12 10:41:48
【问题描述】:

我正在尝试解析 XML 文件,但对命名空间和标签有点困惑。最后我需要从中获取值

  • d:标题
  • d:日期
  • d:Day
  • d:夜晚
  • d:Accuweather
  • d:Gismeteo
<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:georss="http://www.georss.org/georss" xmlns:gml="http://www.opengis.net/gml" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xml:base="https://portal.erg.kz/weather/_api/">
       <id>0832f8fd-2ca1-4152-877b-3b28fc3eb1dc</id>
       <title />
       <updated>2020-02-12T08:53:05Z</updated>
       <entry m:etag="&quot;385&quot;">
          <id>Web/Lists(guid\'891430d2-9610-455c-be63-aa1bfd3c482f\')/Items(1)</id>
          <category term="SP.Data.WeatherInfoListItem" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />
          <link rel="edit" href="Web/Lists(guid\'891430d2-9610-455c-be63-aa1bfd3c482f\')/Items(1)" />
          <title />
          <updated>2020-02-12T08:53:05Z</updated>
          <author>
             <name />
          </author>
          <content type="application/xml">
             <m:properties>
                <d:Title>Лисаковск</d:Title>
                <d:Date m:type="Edm.DateTime">2020-02-12T00:00:00Z</d:Date>
                <d:Day m:type="Edm.Double">-8</d:Day>
                <d:Night m:type="Edm.Double">-14</d:Night>
                <d:Accuweather>Теплее</d:Accuweather>
                <d:Gismeteo>Переменная облачность, небольшой снег</d:Gismeteo>
                <d:Intellicast m:null="true" />
                <d:theWeatherChannel m:null="true" />
             </m:properties>
          </content>
       </entry>
...

以下代码不返回任何内容

url = 'https://portal.site.com/weather/_api/web/lists#'
r = requests.get(url, auth=HttpNtlmAuth('user','pass'))
xml_string = r.text
root = ET.fromstring(xml_string)
root.findall('{http://schemas.microsoft.com/ado/2007/08/dataservices/metadata}m:properties')

请有人帮我处理代码。 谢谢!

【问题讨论】:

  • 你得到什么错误?
  • 没有错误,只是我得到了空列表
  • 看起来(我没有测试过)你只需要在你的 findall 中删除 m: 前缀...root.findall('{http://schemas.microsoft.com/ado/2007/08/dataservices/metadata}properties')

标签: python xml xml-parsing elementtree


【解决方案1】:

您可以创建别名的 dict 命名空间以便于 xpath 查询

from xml.etree.cElementTree import ElementTree

tree = ElementTree(file="file.xml")
root = tree.getroot()
namespaces = {
    "p": "http://www.w3.org/2005/Atom",
    "m": "http://schemas.microsoft.com/ado/2007/08/dataservices/metadata",
    "d": "http://schemas.microsoft.com/ado/2007/08/dataservices",
}
xpath = "p:entry/p:content/m:properties"
res = root.findall(xpath, namespaces=namespaces)

values = []

for x in res:
    values.append(
        {
            "Title": x.find("d:Title", namespaces=namespaces).text,
            "Date": x.find("d:Date", namespaces=namespaces).text,
            "Day": x.find("d:Day", namespaces=namespaces).text,
            "Night": x.find("d:Night", namespaces=namespaces).text,
            "Accuweather": x.find("d:Accuweather", namespaces=namespaces).text,
            "Gismeteo": x.find("d:Gismeteo", namespaces=namespaces).text,
        }
    )
print(values)

打印

[
    {
        "Title": "Лисаковск",
        "Date": "2020-02-12T00:00:00Z",
        "Day": "-8",
        "Night": "-14",
        "Accuweather": "Теплее",
        "Gismeteo": "Переменная облачность, небольшой снег",
    }
]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-28
    • 1970-01-01
    • 1970-01-01
    • 2021-02-06
    相关资源
    最近更新 更多