1. ホーム
  2. python

[解決済み] (Python) AttributeError: 'NoneType' オブジェクトには 'text' という属性がありません。

2022-02-02 22:53:27

質問

コード内のURLからxmlをパースする際に、以下のようなエラーが発生します。XMLは巨大なので掲載しません。リンクは以下のコード内にあります。

ERROR

---------------------------------------------------------------------------
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'

マイコード

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)

何を見落としているのでしょうか? ありがとうございます。

解決方法は?

をチェックする代わりに child.find('EmentaMateria').textNone を確認する必要があります。 child.find('EmentaMateria')None を最初に指定します。

また、返り値を格納するために child.find('EmentaMateria') を2回呼び出さないようにするためです。

最後に ementa の場合、デフォルト値は child.find('EmentaMateria')None そうでなければ、あなたの print 関数が初期化されていない変数を参照することになります。

変更します。

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

になります。

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

あるいは、組み込みの関数 getattr を使えば、一時変数なしで同じことができます。

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