Как поймать объект 'NoneType' не имеет атрибута 'get' в полном списке - PullRequest
0 голосов
/ 02 июля 2019

Я хочу почистить URL с сайта.Я использую beautifulsoup4.

Структура, которую я пытаюсь очистить, выглядит следующим образом: Структура HTML

Код, который я использую, таков:

soup = BeautifulSoup(response.text, "html.parser")
all_urls = [x.p.a.get('href') for x in soup.findAll("div", class_="b-accordion__text")]

Когда я запускаю скрипт, я получаю следующую ошибку:

'NoneType' object has no attribute 'get'

Это, вероятно, связано с тем, что некоторые из div являются пустыми и не содержат p / a, и поэтому вызывается функция getна несуществующем объекте.

 <div class="b-accordion__text">
</div>

Когда я пытаюсь добавить выражение if, например:

all_urls = [x.p.a.get('href') for x in soup.findAll("div", class_="b-accordion__text") if x.p.a]

, я получаю ошибку, что не существует:

'NoneType' object has no attribute 'a'

Из-за того, что я новичок в Python, я не знаю, как справиться с этой ошибкой.Я бы ожидал предупреждения, что некоторые элементы не имеют ap / a, и сценарий все равно будет выполняться.Но он прерывается.

Вопрос: Как обработать / отловить эту ошибку для пустых тегов div?

Ответы [ 2 ]

0 голосов
/ 02 июля 2019

Добавление двойного оператора if в полный список для проверки, имеет ли он атрибут "p" и "a", решило проблему:

all_urls = [x.p.a.get('href') for x in soup.findAll("div", class_="b-accordion__text") if x.p and x.p.a]
0 голосов
/ 02 июля 2019

Я не проверял код, но вы можете добавить условие в ваше понимание списка следующим образом:

soup = BeautifulSoup(response.text, "html.parser")
all_urls = [x.p.a.get('href') for x in soup.findAll("div", class_="b-accordion__text") if not x.p.a is None]

В более общем случае, для проверки определенного атрибута, вы можете использовать hasattr встроенная функция.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...