Красивый объект Soup4 «NoneType» не имеет атрибута «текст» Ошибка - PullRequest
0 голосов
/ 11 ноября 2018

Пытался извлечь некоторые цифры из Yahoo Finance, но я продолжаю получать AttributeError для одной из моих функций soup.find. Код:

from bs4 import BeautifulSoup as soup
import requests

#Switch
source = requests.get('https://finance.yahoo.com/quote/SWCH?p=SWCH&.tsrc=fin- srch').text
soup = soup(source, 'lxml')
price = soup.find('span', class_=lambda x:x and set(x.split()).issuperset(set("Trsdu(0.3s) Fw(b) Fz(36px) Fw(b) D(b) Mb(-4px)".split())))
downorup = soup.find('span', class_=lambda x:x and set(x.split()).issuperset(set("Trsdu(0.3s) Fw(500) Pstart(10px) Fz(24px) C($dataRed)".split())))
print("Switch stock: " + price.text + ' ' + downorup.text)

Ответы [ 2 ]

0 голосов
/ 11 ноября 2018

Во втором запросе "Fz (24px)" должно быть "Fz (14px)", и не должно быть части "Pstart (10px)":

downorup = soup.find('span', class_=lambda x:x and set(x.split())\
               .issuperset(set("Trsdu(0.3s) Fw(500) Fz(14px) C($dataRed)".split())))

В целом, вы используете довольно опасный подход для идентификации ваших данных. Если форматирование страницы изменится, вы больше не найдете поля. "data-reactid" представляется более надежным маркером.

0 голосов
/ 11 ноября 2018

Ошибка, скорее всего, выдается в операторе print.

Если код не может найти price / downorup - он будет иметь значение None. В этом случае вы пытаетесь получить доступ к атрибутам price.text, downorup.text из объекта None, который выдает исключение.

Добавить проверку на None, например:

if price and downorup:
    print("Switch stock: " + price.text + ' ' + downorup.text)

Это будет выполнено в операторе print, только если оба значения price и downorup не равны None.

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