Синтаксический анализ данных OSM XML с помощью python - PullRequest
0 голосов
/ 22 мая 2018

Я пытаюсь проанализировать путевые теги из XML-файла osm, например, я хочу выполнить поиск по всему XML-файлу, а когда у путевого тега есть значение ak bridge, он сохраняет весь путевой тег в CSV-файл со всемидругие способы, которые имеют метки моста.

 <way id="108534076" visible="true" version="1" changeset="7866393" timestamp="2011-04-15T02:42:51Z" user="richlv" uid="47892">
  <nd ref="1245024935"/>
  <nd ref="1245025038"/>
  <tag k="bridge" v="yes"/>
  <tag k="highway" v="service"/>
 </way>

вот код, который я написал до сих пор, но у меня есть AttributeError

import xml.etree.ElementTree as ET
tree = ET.parse('MER.xml')
root = tree.getroot()

for way in root.findall('way'):
    tag = way.find('.//tag')
    if tag.attrib['k'] == 'bridge' and tag.attrib['v'] == 'yes':
        print tag

файл, который у меня есть, очень большой, и я ищудо 4000 путевых тегов для примерно 34 мостовых тегов.

Отслеживание ошибок

1 Ответ

0 голосов
/ 22 мая 2018

Проблема в том, что не все <way> элементы имеют <tag> внизу.Вы можете исправить это, установив

import xml.etree.ElementTree as ET
tree = ET.parse('MER.xml')
root = tree.getroot()

for way in root.findall('way'):
    tag = way.find('.//tag')
    if tag and tag.attrib['k'] == 'bridge' and tag.attrib['v'] == 'yes':
        print tag

Или вы можете перейти в xpath и позволить документу xml сделать всю работу за вас

import xml.etree.ElementTree as ET
tree = ET.parse('MER.xml')
for tag in tree.findall('//way//tag[@k="bridge"][@v="yes"]'):
    print tag

А для больших файлов обычно используется lxmlбыстрее

import lxml.etree
tree = lxml.etree.parse('MER.xml')
for tag in tree.findall('//way//tag[@k="bridge"][@v="yes"]'):
    print tag
...