使用 Python 解析 XML - 命名空间

Parsing XML with Python - namespaces

我想使用开放数据,xml 存储在这里:

http://offenedaten.frankfurt.de/dataset/912fe0ab-8976-4837-b591-57dbf163d6e5/resource/48378186-5732-41f3-9823-9d1938f2695e/download/parkdatendyn.xml

在这个论坛的帮助下我写了代码

from lxml import etree
from urllib.request import urlopen


root = etree.parse(urlopen(url)).getroot()


ns = { 'd': 'http://datex2.eu/schema/2/2_0' }

parking_area = root.xpath('//d:parkingAreaStatus', namespaces=ns)
parking_facility = root.xpath('//d:parkingFacilityStatus', namespaces=ns)

for pa in parking_area:
    area_ref = pa.find('d:parkingAreaReference', ns)
    ParkingspaceList.append(str((area_ref.get('id'))))


for pf in parking_facility:
    facility_ref = pf.find('d:parkingFacilityReference', ns)
    ParkingspaceList.append(str((facility_ref.get('id'))))

这似乎适用于 "pa" 但对于 "pf" 我收到一条失败消息:

ParkingspaceList.append(str((facility_ref.get('id')))) AttributeError: 'NoneType' 对象没有属性 'get'

有什么建议吗?

此致

TR

同名的parkingFacilityStatus元素中有parkingFacilityStatus个元素,比较混乱:

<parkingFacilityStatus>
    …
    <parkingFacilityReference targetClass="ParkingFacility" id="24278[Karstadt]" version="1.0"/>
    <parkingFacilityStatus>closed</parkingFacilityStatus>
    …
</parkingFacilityStatus>

这是

    <parkingFacilityStatus>closed</parkingFacilityStatus>

给出错误,因为该元素没有 parkingFacilityReference 子元素。

使用

for pf in parking_facility:
    facility_ref = pf.find('d:parkingFacilityReference', ns)
    if facility_ref is not None:
        ParkingspaceList.append(str((facility_ref.get('id'))))

而且有效。