#python #web-scraping
Вопрос:
Итак, в настоящее время у меня есть это, которое извлекает данные из finviz и выводит всю таблицу статистики по акциям. Тем не менее, я хотел бы иметь возможность извлекать только сумму или процент из определенной «ячейки:
#---------- Pretend to be a browser. ----------#
headers = {
"User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.75 Safari/537.36",
"X-Requested-With": "XMLHttpRequest"
}
#---------- Import needed modules. ----------#
import pandas as pd
from bs4 import BeautifulSoup
import requests
#---------- Choose your ticker. Takes input. ----------#
ticker = input("Please choose a ticker symbol: ")
print("Loading data for " ticker.upper())
#---------- Pulling the data from chosen stock ticker ----------#
url = ('https://finviz.com/quote.ashx?t=' ticker.upper())
req = requests.get(url,headers=headers)
table = pd.read_html(req.text, attrs = {"class":"snapshot-table2"} )
df = table[0]
print(df)
Что дает мне (я отключил часть вывода, чтобы не делать вопрос таким длинным):
Пожалуйста, выберите символ тикера: ko
Загрузка данных для KO
0 1 2 3 4 5
0 Index DJIA Samp;P500 P/E 30.02 EPS (ttm) 1.87
1 Market Cap 242.71B Forward P/E 23.00 EPS next Y 2.44
2 Income 8.08B PEG 2.97 EPS next Q 0.58
3 Sales 36.41B P/S 6.67 EPS this Y -13.30%
4 Book/sh 5.16 P/B 10.85 EPS next Y 7.84%
5 Cash/sh 3.01 P/C 18.61 EPS next 5Y 10.12%
6 Dividend 1.68 P/FCF 93.97 EPS past 5Y 1.40%
7 Dividend % 3.00% Quick Ratio 1.30 Sales past 5Y -5.70%
8 Employees 80300 Current Ratio 1.50 Sales Q/Q 41.70%
9 Optionable Yes Debt/Eq 1.89 EPS Q/Q 47.70%
10 Shortable Yes LT Debt/Eq 1.79 Earnings Jul 21 BMO
11 Recom 2.20 SMA20 -1.44% SMA50 0.48%
Как я могу вытащить только одну «ячейку»? Допустим, я хотел получить текущее соотношение PE, как я могу просто получить «30.02»? Спасибо!
Комментарии:
1. Было бы лучше расположить ваши данные таким образом, чтобы каждый столбец соответствовал метке из столбцов 1, 3 и 5.
Ответ №1:
Таким образом, вы можете просто распечатать любые выборочные данные:
#---------- Pretend to be a browser. ----------#
headers = {
"User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.75 Safari/537.36",
"X-Requested-With": "XMLHttpRequest"
}
#---------- Import needed modules. ----------#
import pandas as pd
from bs4 import BeautifulSoup
import requests
#---------- Choose your ticker. Takes input. ----------#
ticker = input("Please choose a ticker symbol: ")
print("Loading data for " ticker.upper())
#---------- Pulling the data from chosen stock ticker ----------#
url = ('https://finviz.com/quote.ashx?t=' ticker.upper())
req = requests.get(url,headers=headers)
table = pd.read_html(req.text, attrs = {"class":"snapshot-table2"} )
df = table[0]
print(f'{df[2][0]}: {df[3][0]}')
Выход:
Please choose a ticker symbol: ko
Loading data for KO
P/E: 30.02
Ответ №2:
Ты можешь сделать вот так.
Поскольку значение «P/E» находится в 4 <td>
-м внутри первой строки, вы можете выбрать первое <tr>
и извлечь необходимую информацию.
headers = {
"User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.75 Safari/537.36",
"X-Requested-With": "XMLHttpRequest"
}
#---------- Import needed modules. ----------#
from bs4 import BeautifulSoup
import requests
#---------- Choose your ticker. Takes input. ----------#
ticker = input("Please choose a ticker symbol: ")
print("Loading data for " ticker.upper())
#---------- Pulling the data from chosen stock ticker ----------#
url = ('https://finviz.com/quote.ashx?t=' ticker.upper())
req = requests.get(url,headers=headers)
soup = BeautifulSoup(req.text, 'lxml')
table = soup.find('table', attrs = {"class":"snapshot-table2"} )
tr = table.find('tr')
PE = tr.select_one('td:nth-of-type(3)').text.strip()
PE_val = tr.select_one('td:nth-of-type(4)').text.strip()
print(f'{PE}: {PE_val}')
Please choose a ticker symbol: ko
Loading data for KO
P/E: 30.02
Please choose a ticker symbol: MS
Loading data for MS
P/E: 13.72