(Python) AttributeError: ‘NONETYPE’ object heeft geen attribuut ‘Text’

Ik krijg de fout hieronder als ik de XML van de URL in de Code parseer. Ik zal de XML niet plaatsen omdat het enorm is. De link zit in de onderstaande code.

FOUT:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-70-77e5e1b79ccc> in <module>()
     11 
     12 for child in root.iter('Materia'):
---> 13     if not child.find('EmentaMateria').text is None:
     14             ementa = child.find('EmentaMateria').text
     15 
AttributeError: 'NoneType' object has no attribute 'text'

Mijn code:

url = 'http://legis.senado.leg.br/dadosabertos/senador/4988/autorias'
import requests
from xml.etree import ElementTree
response = requests.get(url, stream=True)
response.raw.decode_content = True
tree = ElementTree.parse(response.raw)
root = tree.getroot()
for child in root.iter('Materia'):
    if child.find('EmentaMateria').text is not None:
            ementa = child.find('EmentaMateria').text
    for child_IdMateria in child.findall('IdentificacaoMateria'):
        anoMateria = child_IdMateria.find('AnoMateria').text
        materia = child_IdMateria.find('NumeroMateria').text
        siglaMateria = child_IdMateria.find('SiglaSubtipoMateria').text
    print('Ano = '+anoMateria+' | Numero Materia = '+materia+' | tipo = '+siglaMateria+' | '+ementa)

Wat ik hier overziet?
Bedankt


Antwoord 1, Autoriteit 100%

In plaats van te controleren of child.find('EmentaMateria').textniet Noneis, moet u ervoor zorgen dat child.find('EmentaMateria')is niet eerst None.

U moet ook de terugkerende waarde van child.find('EmentaMateria')opslaan om te voorkomen dat deze twee keer wordt aangeroepen.

Ten slotte moet u ementaeen standaardwaarde toewijzen als child.find('EmentaMateria')Noneis; anders verwijst uw functie printhieronder naar een niet-geïnitialiseerde variabele.

Wijzigen:

if child.find('EmentaMateria').text is not None:
    ementa = child.find('EmentaMateria').text

naar:

node = child.find('EmentaMateria')
if node is not None:
    ementa = node.text
else:
    ementa = None

Als alternatief kunt u de ingebouwde functie getattrgebruiken om hetzelfde te doen zonder een tijdelijke variabele:

ementa = getattr(child.find('EmentaMateria'), 'text', None)

Other episodes