Разбор XML-файлов с помощью Python xml.etree: пустые результаты

Я пытаюсь разобрать следующий xml-файл с помощью xml.etree. Однако это не дает никаких результатов.

from xml.etree import cElementTree as ET
xmlstr = """<?xml version='1.0' encoding='UTF-8'?>

<tns:getCamerasResponse xmlns:tns="https://infoconnect.highwayinfo.govt.nz/schemas/camera2">

    <tns:camera>

        <tns:description>North along Sth Wstn Mwy from May Rd</tns:description>

        <tns:direction>Northbound</tns:direction>

        <tns:group>NA</tns:group>

        <tns:id>653</tns:id>

        <tns:imageUrl>http://www.trafficnz.info/camera/653.jpg</tns:imageUrl>

        <tns:lat>-36.90943</tns:lat>

        <tns:lon>174.73442</tns:lon>

        <tns:name>SH20 May Rd Overbridge</tns:name>

        <tns:offline>false</tns:offline>

        <tns:region>Auckland</tns:region>

        <tns:thumbUrl>http://www.trafficnz.info/camera/thumb/653.jpg</tns:thumbUrl>

        <tns:underMaintenance>false</tns:underMaintenance>

        <tns:viewUrl>http://www.trafficnz.info/camera/view/653</tns:viewUrl>

 </tns:camera>
 </tns:getCamerasResponse>"""



root = ET.fromstring(xmlstr)


results = root.findall('tns:camera', {'tns':"https://infoconnect.highwayinfo.govt.nz/schemas/camera2"})
for camera in results:
    region = camera.find('tns:region')
    if region is not None:
        print(region.text)

person Nilani Algiriyage    schedule 24.09.2019    source источник
comment
Вам не хватает пространства имен, я думаю, что results = root.findall('ns:camera', {'ns':"https://infoconnect.highwayinfo.govt.nz/schemas/camera2"}) должно работать   -  person Manuel    schedule 25.09.2019
comment
Рассматриваемый тег не <camera>, а <tns:camera>, и вы не учитываете это. Почитайте о пространствах имен xml.   -  person John Gordon    schedule 25.09.2019
comment
@Manuel: добавил эти результаты = root.findall('tns:camera', {'tns':infoconnect.highwayinfo.govt.nz/schemas/camera2}). Все еще дает пустые результаты.   -  person Nilani Algiriyage    schedule 25.09.2019
comment
results = root.findall('tns:camera', {'tns':"https://infoconnect.highwayinfo.govt.nz/schemas/camera2"}) у меня работает   -  person Manuel    schedule 25.09.2019
comment
@Manuel: я отредактировал код после добавления пространства имен. Тем не менее я не получаю никаких результатов. Не могли бы вы опубликовать свой код в качестве ответа? Спасибо.   -  person Nilani Algiriyage    schedule 25.09.2019


Ответы (1)


Вам необходимо учитывать пространства имен в ваших методах поиска.

from xml.etree import cElementTree as ET
xmlstr = """<?xml version='1.0' encoding='UTF-8'?>

<tns:getCamerasResponse xmlns:tns="https://infoconnect.highwayinfo.govt.nz/schemas/camera2">

    <tns:camera>

        <tns:description>North along Sth Wstn Mwy from May Rd</tns:description>

        <tns:direction>Northbound</tns:direction>

        <tns:group>NA</tns:group>

        <tns:id>653</tns:id>

        <tns:imageUrl>http://www.trafficnz.info/camera/653.jpg</tns:imageUrl>

        <tns:lat>-36.90943</tns:lat>

        <tns:lon>174.73442</tns:lon>

        <tns:name>SH20 May Rd Overbridge</tns:name>

        <tns:offline>false</tns:offline>

        <tns:region>Auckland</tns:region>

        <tns:thumbUrl>http://www.trafficnz.info/camera/thumb/653.jpg</tns:thumbUrl>

        <tns:underMaintenance>false</tns:underMaintenance>

        <tns:viewUrl>http://www.trafficnz.info/camera/view/653</tns:viewUrl>

 </tns:camera>
 </tns:getCamerasResponse>"""



root = ET.fromstring(xmlstr)

ns = {'tns':"https://infoconnect.highwayinfo.govt.nz/schemas/camera2"}
results = root.findall('tns:camera', ns)
for camera in results:
    region = camera.find('tns:region', ns)
    if region is not None:
        print(region.text)

Если вам нужно знать, как получить пространство имен, это может помочь, возможно, Python: ElementTree, получить строку пространства имен элемента

person Manuel    schedule 24.09.2019