Показатели BeautifulSoup и Reuters - PullRequest
0 голосов
/ 29 апреля 2020

Я новый Python программист и пытался разобрать некоторые ключевые показатели в Reuters, но не могу сделать это правильно.

Вот мой код:

import requests
from bs4 import BeautifulSoup
import lxml
import pandas as pd

url = 'https://www.reuters.com/companies/AAPL.OQ/key-metrics'

page = requests.get(url)

if page.status_code == requests.codes.ok:
  bs = BeautifulSoup(page.text, 'lxml')

  list_all_keys = bs.findAll('tr', class_='data')

  key_name = bs.find('th', class_='MarketsTable-label-_JI6s').find('div', class_='TextLabel__text-label___3oCVw TextLabel__gray___1V4fk TextLabel__regular___2X0ym MarketsTable-label-_JI6s')

  for key in key_name:
    beta = key.find('Beta')
    print(beta)

Бета это метри c я хочу. Дает мне «-1» в качестве ответа. Я хочу, чтобы значение в 'span' было связано с именем.

Что мне делать?

Ответы [ 2 ]

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

Несколько способов сделать это. 1) Вы можете найти элемент со строкой "Beta" в html, а затем получить следующий элемент <td>. 2) Используйте pandas 'read_html(), чтобы получить таблицу, затем запросите / извлеките то, что вы конкретно хотите из таблицы. или 3) Я предпочитаю эту опцию, так как она дает вам необработанные, необработанные данные: просто получите ответ json от API. Все решения приведены ниже:

Решение 1:

import requests
from bs4 import BeautifulSoup
import re

url = 'https://www.reuters.com/companies/AAPL.OQ/key-metrics'
page = requests.get(url)

if page.status_code == requests.codes.ok:
  bs = BeautifulSoup(page.text, 'html.parser')

  beta = bs('th',text=re.compile(r'Beta'))[0].find_next('td').text
  print (beta)

Решение 2:

import pandas as pd
url = 'https://www.reuters.com/companies/AAPL.OQ/key-metrics'
df = pd.read_html(url)[0]
print (df[df[0] == 'Beta'].iloc[0,1])

Решение 3:

import requests
from pandas.io.json import json_normalize

url = 'https://www.reuters.com/companies/api/getFetchCompanyKeyMetrics/AAPL.OQ'
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'}
jsonData = requests.get(url, headers=headers).json()
print (jsonData['market_data']['beta'])


df = json_normalize(jsonData['market_data'])
df.to_csv('file.csv', index=False)

# Or to excel file
#df.to_excel('file.xls', index=False)

Вывод: в порядке предоставленного решения:

1.14
1.13
1.13326

Чтобы получить ответ JSON:

Если вы go до Inspect страницы и посмотрите на панель справа. Go до Network -> XHR. Просмотрите запросы слева и посмотрите, есть ли там данные, которые вам нужны (возможно, потребуется перезагрузить страницу, тогда вам нужно будет щелкнуть вокруг, чтобы найти ее).

enter image description here

Если вы найдете его, go до Headers, чтобы получить Request URL, который вы будете использовать для получения этого ответа.

Как только вы получите ответ, преобразовать в таблицу и вывести в Excel, см. код для решения 3.

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

Я немного изменил ваши инструкции, я попытался упростить запрос класса и использовал .text, что позволяет вам экстраполировать текст внутри. Я использовал предположение, что th и td являются единственными в строке, как в URL-адресе, который вы просили (чтобы удалить выбор класса).

Примечание: я использовал для, вы можете использовать фильтр

import requests
from bs4 import BeautifulSoup

url = 'https://www.reuters.com/companies/AAPL.OQ/key-metrics'

page = requests.get(url)

if page.status_code == requests.codes.ok:
  bs = BeautifulSoup(page.text, 'lxml')

  list_all_keys = bs.findAll('tr', class_='data')

  for key in list_all_keys:
    title = key.find("th").text
    if title == "Beta":
      print(key.find("td").text)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...