@Bjornie
Изучаю Python

Как обработать AttributeError: 'NoneType' object has no attribute 'text'?

При парсинге периодически выдается ошибка "AttributeError: 'NoneType' object has no attribute 'text'", т.к. парсер не может найти нужный элемент по селектору и узнать у него text.

Данные получаю так:
fax = soup.find(id="ctl0_left_fax")

Затем добавляю в массив (на этом скрипт спотыкается): 'fax': fax.text.strip(),

Пробовал сделать проверку:
#  Проверяю, если у страницы TITLE пустой, значит там нечего парсить. ХОЧУ ПРОПУСТИТЬ ДАЛЬНЕЙШИЙ  ПАРСИНГ
if (len(soup.title.text.strip()) == 15) or (soup.title.text.strip() == 'testtesttest -'):
    exit
#  Если у страницы TITLE <16 (значит там есть какой-то контент), то посмотреть текст у селекторов
else:
    list = {
               'cap': cap.text.strip(),
               'fax': fax.text.strip(),
               'email': email.text.strip(),
        }


Но почему-то это игнорируется (хотя проверял - работает).

Добавлю, что реализовал подобный алгоритм на PHP и у меня все работало.

Более того, на этапе добавления в массив я ПРЯМО В НЕМ проверял через возвращаемый тип данных через тернарный оператор, но в питоне это не проходит.
  • Вопрос задан
  • 14822 просмотра
Пригласить эксперта
Ответы на вопрос 2
@deliro
BeautifulSoup спроектирован таких колхозным способом, что он отдаёт None, если не нашёл элемент, а не рейзит исключение или элемент-пустышку, поэтому каждый элемент, который ты ищешь, нужно проверять. Т.е.:
fax = soup.find(id="ctl0_left_fax")
if fax:
    another_element = fax.find(class_='some_class')
    if another_element:
        another_one = another_element.find(class_='some_another_class')
        if another_one:
            do_something()

Либо кулхацкерское решение, чтобы не плодить ветвления:
fax = soup.find(id="ctl0_left_fax")
another_element = fax and fax.find(class_='some_class')
another_one = another_element and another_element.find(class_='some_another_class')
if another_one:
    do_something()


Совет тут один: не использовать BeautifulSoup.
Ответ написан
Комментировать
@kukharev_a
Обрабатывайте исключения
try:  

except:
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы