Получение информации с помощью дерева элементов

#python #openstreetmap #elementtree

Вопрос:

Я пытаюсь извлечь информацию с помощью ElementTree. Мне удалось получить данные по многим атрибутам, но обработка останавливается, возможно, из-за недостатка информации. Он отображает это сообщение об ошибке :

 xml.etree.ElementTree.ParseError: no element found: line 1, column 0
 

Вот код, который я использую :

 import xml.etree.ElementTree

MyosmID = str(id_cinema)
r = requests.get("https://www.openstreetmap.org/api/0.6/node/" MyosmID)
root = xml.etree.ElementTree.fromstring(r.content)

for child in root.iter('tag'):
    if child.attrib['k'] == 'website':
        website = child.attrib['v']
    if child.attrib['k'] == 'wikidata':
        wikidata = child.attrib['v']
 

Как я могу решить эту проблему с ошибкой?

Комментарии:

1. Добавьте следующие строки перед вызовом fromstring : print(r.status_code) print(r.content) ; или, в качестве альтернативы, просто r.raise_for_status() если вы хотите вызвать ошибку при неверном ответе.

2. Я подозреваю, что вы получаете ответ 404 «Не найдено», как и я, когда тестирую с помощью MyosmID = '12345'

3. когда я тестирую с помощью MyosmID = ‘630982183’ атрибута, который потенциально блокирует обработку, я получаю то же самое сообщение об ошибке выше (в моем вопросе)

4. Я получаю другую ошибку с этим вводом. requests.exceptions.HTTPError: 410 Client Error: Gone for url: https://www.openstreetmap.org/api/0.6/node/630982183

5. когда я это делаю, я тоже получаю ошибку 410: Запросы.исключения. HTTPError: Ошибка клиента 410: Пропал URL: openstreetmap.org/api/0.6/node/630982183

Ответ №1:

Я добавил это в свой код, и проблема решена :

     MyosmID = str(id_cinema)
try : 
    r = requests.get("https://www.openstreetmap.org/api/0.6/node/" MyosmID)
    r.raise_for_status()
    root = xml.etree.ElementTree.fromstring(r.content)
    
    fromstring: print(r.status_code) 
    
    for child in root.iter('tag'):
        if child.attrib['k'] == 'website':
            website = child.attrib['v']
        if child.attrib['k'] == 'wikidata':
            wikidata = child.attrib['v']
except Exception:
    pass 
 

Спасибо вам за вашу помощь 🙂