Как я могу выбрать определенные значения из таблицы с помощью Python?

#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