Как очистить определенные данные от Yahoo Finance? - PullRequest
1 голос
/ 25 февраля 2020

Я новичок в изучении веб-страниц и пытаюсь очистить страницу "статистики" финансов Yahoo для AAPL. Вот ссылка: https://finance.yahoo.com/quote/AAPL/key-statistics?p=AAPL

Вот код, который у меня есть до сих пор ...

from bs4 import BeautifulSoup
from requests import get


url = 'https://finance.yahoo.com/quote/AAPL/key-statistics?p=AAPL'
response = get(url)
soup = BeautifulSoup(response.text, 'html.parser')

stock_data = soup.find_all("table")

for stock in stock_data:
    print(stock.text)

Когда я запускаю его, я возвращаю всю таблицу данные на странице. Однако я хочу указать только c данные из каждой таблицы (например, «Рыночная капитализация», «Доход», «Бета»).

Я попытался возиться с кодом, выполнив print(stock[1].text), чтобы проверить, Я мог бы ограничить количество возвращаемых данных только вторым значением в каждой таблице, но это вернуло сообщение об ошибке. Я на правильном пути, используя BeautifulSoup, или мне нужно использовать совершенно другую библиотеку? Что мне нужно сделать, чтобы вернуть только определенные данные, а не все данные таблицы на странице?

Ответы [ 2 ]

2 голосов
/ 25 февраля 2020

Изучение HTML -кода дает вам лучшее представление о том, как BeautifulSoup будет обрабатывать то, что видит.

Кажется, что на веб-странице содержится несколько таблиц, которые, в свою очередь, содержат информацию, которую вы ищете. Таблицы следуют определенной логике c.

Сначала очистите все таблицы на веб-странице, затем найдите все строки таблицы (

) и данные таблицы (), которые содержат эти строки .

Ниже приведен один из способов достижения этого. Я даже добавил функцию для печати только определенного c измерения.

from bs4 import BeautifulSoup
from requests import get


url = 'https://finance.yahoo.com/quote/AAPL/key-statistics?p=AAPL'
response = get(url)
soup = BeautifulSoup(response.text, 'html.parser')

stock_data = soup.find_all("table")
# stock_data will contain multiple tables, next we examine each table one by one

for table in stock_data:
    # Scrape all table rows into variable trs
    trs = table.find_all('tr')
    for tr in trs:
        # Scrape all table data tags into variable tds
        tds = tr.find_all('td')
        # Index 0 of tds will contain the measurement
        print("Measure: {}".format(tds[0].get_text()))
        # Index 1 of tds will contain the value
        print("Value: {}".format(tds[1].get_text()))
        print("")


def get_measurement(table_array, measurement):
    for table in table_array:
        trs = table.find_all('tr')
        for tr in trs:
            tds = tr.find_all('td')
            if measurement.lower() in tds[0].get_text().lower():
                return(tds[1].get_text())


# print only one measurement, e.g. operating cash flow
print(get_measurement(stock_data, "operating cash flow"))
0 голосов
/ 12 марта 2020

Хотя это не Yahoo Finance, вы можете сделать что-то очень похожее на это ...

import requests
from bs4 import BeautifulSoup

base_url = 'https://finviz.com/screener.ashx?v=152&o=price&t=MSFT,AAPL,SBUX,S,GOOG&o=price&c=0,1,2,3,4,5,6,7,8,9,25,63,64,65,66,67'
html = requests.get(base_url)
soup = BeautifulSoup(html.content, "html.parser")
main_div = soup.find('div', attrs = {'id':'screener-content'})

light_rows = main_div.find_all('tr', class_="table-light-row-cp")
dark_rows = main_div.find_all('tr', class_="table-dark-row-cp")

data = []
for rows_set in (light_rows, dark_rows):
    for row in rows_set:
        row_data = []
        for cell in row.find_all('td'):
            val = cell.a.get_text()
            row_data.append(val)
        data.append(row_data)

#   sort rows to maintain original order
data.sort(key=lambda x: int(x[0]))

import pandas
pandas.DataFrame(data).to_csv("C:\\your_path\\AAA.csv", header=False)

Это хорошая замена, если Yahoo решила отказаться от большей функциональности своего API. Я знаю, что они вырезали много вещей (в основном исторические цитаты) пару лет за go. Было грустно видеть, что go прочь.

enter image description here

enter image description here

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