(Python)AttributeError:'NoneType'对象没有属性'text'

grc*_*grc 2 python xml xml-parsing python-requests

当我从代码中的URL解析xml时,我收到以下错误.我不会发布XML,因为它很大.链接在下面的代码中.

错误:

---------------------------------------------------------------------------
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'
Run Code Online (Sandbox Code Playgroud)

我的代码:

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)
Run Code Online (Sandbox Code Playgroud)

我在这里俯瞰什么?谢谢

blh*_*ing 6

child.find('EmentaMateria').textNone应该检查是否不是,你应该确保child.find('EmentaMateria')不是None第一个.

此外,您应该存储返回值child.find('EmentaMateria')以避免调用它两次.

最后,ementa如果child.find('EmentaMateria')是,则应指定默认值None; 否则你的print下面的函数将引用一个未初始化的变量.

更改:

if child.find('EmentaMateria').text is not None:
    ementa = child.find('EmentaMateria').text
Run Code Online (Sandbox Code Playgroud)

至:

node = child.find('EmentaMateria')
if node is not None:
    ementa = node.text
else:
    ementa = None
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用内置函数getattr执行相同操作而无需临时变量:

ementa = getattr(child.find('EmentaMateria'), 'text', None)
Run Code Online (Sandbox Code Playgroud)