BeautifulSoup - у объекта 'NoneType' нет атрибута 'getText' - PullRequest
0 голосов
/ 21 декабря 2018

Я использую BeautifulSoup для получения информации о ценах на подержанные смартфоны Iphone7.После того, как я использую библиотеку bs4, чтобы получить соответствующий html, и использую BeautifulSoup, чтобы создать объект под названием «суп», я ищу информацию о каждом продукте, используя следующий код:

soup = BeautifulSoup(html,'html5lib')
products = soup.find_all('div', class_='feed-item sc-gqjmRU igneJk')

Это дает мне правильныйHTML информация о каждом продукте.Теперь я иду на один уровень глубже, чтобы увидеть описания для каждого продукта:

descriptions = [x.find('p', class_='sc-kAzzGY kZncUf') for x in products]

Код, приведенный выше, работает нормально.Однако это не то описание, которое я хочу.Это довольно грубая форма того, что я ищу.Чтобы получить только те описания, которые я упомянул, мне нужно написать что-то вроде этого (нужно добавить .getText ()):

descriptions = [x.find('p', class_='sc-kAzzGY kZncUf').getText() for x in products]

Это дает мне следующую ошибку:

----> 1 описание = [x.find ('p', класс _ = 'sc-kAzzGY kZncUf'). GetText () для x в продуктах]

AttributeError: объект 'NoneType' не имеет атрибута'getText'

Однако приведенный ниже код работает нормально:

descriptions = [x.find('p', class_='sc-kAzzGY kZncUf') for x in products]
descriptions[0].getText()

description [0] должно совпадать со значением x.find ('p',класс _ = 'sc-kAzzGY kZncUf'), который мы получаем из первой итерации.

Мой вопрос: Поскольку они должны давать одно и то же значение (как x.find, так и description [0]), почемуодин выдает ошибку, а другой работает?

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

Когда вы запускаете descriptions = [x.find('p', class_='sc-kAzzGY kZncUf').getText() for x in products], для каждого экземпляра x.find('p', class_='sc-kAzzGY kZncUf') используется getText().Все, что нужно, это один из них, чтобы быть None, чтобы вся итерация не работала.Когда вы создаете список descriptions как descriptions = [x.find('p', class_='sc-kAzzGY kZncUf') for x in products], в этом списке присутствует более одного элемента, причем первый - это не None, а как минимум один из других элементов.

0 голосов
/ 21 декабря 2018

Это просто означает, что один из продуктов не имеет элемента, соответствующего .find('p', class_='sc-kAzzGY kZncUf') критериям поиска.

Вы можете добавить эту дополнительную проверку и сделать:

for product in products:
    description_element = product.find('p', class_='sc-kAzzGY kZncUf')
    description = description_element.get_text() if description_element else "No Description"

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