xml .etree.ElementTree.ParseError проблема при попытке извлечь данные из XML с использованием PY3 - PullRequest
0 голосов
/ 20 марта 2020

У меня возникла проблема при попытке извлечь письмо из файла xml, используя Python3.

Мой код:

import xml.etree.ElementTree as ET
import ssl

# Ignore SSL certificate errors
ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE

data = '''<row>
    <row _id="row-jyi7-56ru_b7km" _uuid="00000000-0000-0000-B614-7FFDD7C1595B" _position="0" _address="https://www.dati.lombardia.it/resource/zzzz-zzzz/row-jyi7-56ru_b7km">
        <codice_regionale>MI1604</codice_regionale>
        <denom_farmacia>Farmacia Varesina</denom_farmacia>
        <indirizzo>VIA VARESINA, 121</indirizzo>
        <localita>Milano</localita>
        <telefono>3480813398</telefono>
        <email>silvana.toschi@gmail.com</email>
        <caratterizzazione>urbana</caratterizzazione>
        <esenzioni>true</esenzioni>
        <location latitude="45.500881" longitude="9.141339"/>
</row>'''

tree = ET.fromstring(data) #standard ET
results = tree.findall('email') #find the count section in xml

print(results.text)

ошибка Я получаю

Traceback (most recent call last):
  File "farmacie.py", line 25, in <module>
    tree = ET.fromstring(data) #standard ET
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/xml/etree/ElementTree.py", line 1321, in XML
    return parser.close()
xml.etree.ElementTree.ParseError: no element found: line 12, column 6

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

1 Ответ

1 голос
/ 20 марта 2020

Похоже, у вас есть элемент строки, определенный дважды (или у вас отсутствует дополнительный конечный тег), что вызывает одну проблему. Следующим является то, что findall() вернет список, поэтому вам нужно будет выбрать его или распечатать все:

import xml.etree.ElementTree as ET

data = '''<row _id="row-jyi7-56ru_b7km" _uuid="00000000-0000-0000-B614-7FFDD7C1595B" _position="0" _address="https://www.dati.lombardia.it/resource/zzzz-zzzz/row-jyi7-56ru_b7km">
        <codice_regionale>MI1604</codice_regionale>
        <denom_farmacia>Farmacia Varesina</denom_farmacia>
        <indirizzo>VIA VARESINA, 121</indirizzo>
        <localita>Milano</localita>
        <telefono>3480813398</telefono>
        <email>silvana.toschi@gmail.com</email>
        <caratterizzazione>urbana</caratterizzazione>
        <esenzioni>true</esenzioni>
        <location latitude="45.500881" longitude="9.141339"/>
</row>'''

tree = ET.fromstring(data) #standard ET
results = tree.findall('email') #find the count section in xml

print(results[0].text)

Или:

for r in results:
    print(r.text)

Обновить :

После получения полного набора данных правильный способ получить все электронные письма будет выглядеть следующим образом:

import xml.etree.ElementTree as ET
import requests

data = requests.get('https://www.dati.lombardia.it/api/views/5dq5-xs9z/rows.xml').content

tree = ET.fromstring(data)
results = tree.findall("./row/row/email")

for r in results:
    print(r.text)

Результаты (2 684 строки):

silvana.toschi@gmail.com
farmacia.manelli@hotmail.com
badobruno@hotmail.com
giovannibrambilla@msn.com
...
...