Как я могу обойти ошибку атрибута: «Нет»? - PullRequest
0 голосов
/ 15 апреля 2020

У меня есть это тело кода, где я пытаюсь извлечь текст из тегов th и td.

d = urllib.request.urlopen(url).read()
soup = bs(d,'lxml')
find_tr = soup.find_all('tr') #Iterates through 'tr'
for i in find_tr:
 for j in i.find_all('th'): #iterates through 'th' tags in the 'tr'
     if j is not None:
         print(j.th.text)
 for k in i.find_all('td'): #iterates through 'td' tags in 'tr'
     if k is not None:
         print(k.td.text)

После запуска я получаю эту ошибку:


AttributeError: 'NoneType' object has no attribute 'text'

Как мне это исправить?

Ответы [ 3 ]

1 голос
/ 15 апреля 2020

Используйте попытку, за исключением ошибки атрибута, чтобы обойти все проблемы:

for i in find_tr:
    for j in i.find_all('th'): #iterates through 'th' tags in the 'tr'
        try:
            print(j.th.text)
        except AttributeError:
            continue
    for k in i.find_all('td'): #iterates through 'td' tags in 'tr'
        try:
            print(k.td.text)
        except AttributeError:
            continue
0 голосов
/ 15 апреля 2020

В качестве альтернативы ответу Габипа:

вы можете проверить, существует ли атрибут:

class Foo:
  def __init__(self):
    self.foo = "foo text"

>>> fooObj = Foo()
>>> fooObj.text
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'O' object has no attribute 'text'
>>> dir(o)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'foo']

if "text" in dir(o):
  print("has attr")
else: 
  print("does not have attr")
# prints: "does not have attr"

0 голосов
/ 15 апреля 2020

Вы должны добавить условия, проверяющие, что k.td и j.th не None.

Например:

for i in find_tr:
 for j in i.find_all('th'): #iterates through 'th' tags in the 'tr'
     if j.th is not None:
         print(j.th.text)
 for k in i.find_all('td'): #iterates through 'td' tags in 'tr'
     if k.td is not None:
         print(k.td.text)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...