Не удалось удалить указанный класс c 'span' с помощью BeautifulSoup - PullRequest
0 голосов
/ 19 апреля 2020

Я отказываюсь от https://ca.finance.yahoo.com/quote/AAPL и хочу получить изменение цены акций, текст зеленого / красного цвета. Мне удалось отсканировать цену акций, но не значение изменения, поскольку они находятся в одном и том же классе 'div', но в другом классе 'span'.

Текст, который я хочу: '-3.89 (-1.36%) '- номера будут варьироваться

HTML с веб-сайта:

    <div class="My(6px) Pos(r) smartphone_Mt(6px)" data-reactid="29">
        <div class="D(ib) Va(m) Maw(65%) Ov(h)" data-reactid="30">
            <div class="D(ib) Mend(20px)" data-reactid="31"><span class="Trsdu(0.3s) Fw(b) 
             Fz(36px) Mb(-4px) D(ib)" data-reactid="32">282.80</span>
                   <span class="Trsdu(0.3s) Fw(500) Pstart(10px) Fz(24px) C($negativeColor)" 
                    data-reactid="33">-3.89 (-1.36%)</span>

Что я использовал, чтобы получить цену: (282.80) - цены могут варьироваться

stockLink = ('https://ca.finance.yahoo.com/quote/AAPL')
stockPage = requests.get(stockLink)
stockSoup = BeautifulSoup(stockPage.text, 'lxml')
stockQuote = stockSoup.find('div', {'class': 
                                       'My(6px)Pos(r)smartphone_Mt(6px)'}).find('span').text 
print(stockQuote)

Я пробовал много вариантов, пытаясь изменить имя класса, имя диапазона и использование data-реакции, но ни одна из них, похоже, не работает, все они выводят пустой «[]».

Большое спасибо.

1 Ответ

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

Похоже, проблема в этой строке

stockQuote = page_soup.find('div', {'class': 'My(6px)Pos(r)smartphone_Mt(6px)'}).find('span').text

Имена классов должны быть разделены пробелами, поскольку каждый из них отличается от класса в html.

Решение состоит в том, чтобы разделить их, как вы видите на странице HTML. Это выглядело бы так (два пробела были добавлены к идентификатору класса):

stockQuote = page_soup.find('div', {'class': 'My(6px) Pos(r) smartphone_Mt(6px)'}).find('span').text

Однако, это возвращает число перед красным / зеленым текстом. Так как в этом элементе есть несколько промежутков, вы должны найти их все. Вот как я это сделал:

stockQuote = page_soup.find('div', {'class': 'My(6px) Pos(r) smartphone_Mt(6px)'}).findAllNext('span')
stockQuote = stockQuote[1].text

Функция findAllNext найдет промежутки в этом div. Возвращает около 36, но тот, который вы ищете, является вторым. Затем вы просто получаете текст из него, как и прежде, и он должен вернуть искомое число.

Хотя веб-очистка - хороший инструмент, возможно, стоит заглянуть в yfinance * от Yahoo 1017 * API.

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