Разбор XML через 'ElementTree' в Python - PullRequest
0 голосов
/ 12 февраля 2020

Я пытаюсь проанализировать XML файл, но меня немного путают с пространствами имен и тегами. В конце мне нужно получить значения из

  • d: название
  • d: дата
  • d: день
  • 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')

Может кто-нибудь помочь мне разобраться с код пожалуйста. Спасибо!

1 Ответ

1 голос
/ 12 февраля 2020

Вы можете создать точечное пространство имен псевдонимов для более простых запросов 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": "Переменная облачность, небольшой снег",
    }
]
...