Использование BeautifulSoup для поиска страницы статистики финансов Yahoo - PullRequest
0 голосов
/ 30 июня 2018

Я пытаюсь вычистить данные со страницы статистики финансов Yahoo. В данном случае это «Средняя дивидендная доходность за 5 лет». Данные, которые мне нужны, имеют формат этого типа.

<tr>
  <td>
    <span>5 Year Average Dividend Yield</span>
  </td>
  <td class="Fz(s) Fw(500) Ta(end)">6.16</td>
</tr>

Я новичок в beautifulsoup и пытаюсь прочитать документацию bs4, но пока не повезло. Я только что понял, что разбираю таблицу. (Да, я нуб).

Вот мой код. Он успешно распечатывает все строки в таблице. Мне нужна помощь в выделении строки, которая содержит "5-летний средний дивидендный доход" Мне просто нужно числовое значение в следующем столбце. Заранее спасибо.

Новое редактирование: я поместил версию 0.8 ниже, которая возвращает значение "Средний доход по дивидендам за 5 лет", которое я искал.

# Version 0.8 - This worked. It got the value for "5 Year Average Dividend Yield"
# Aim: Find value for"5 Year Average Dividend Yield".

import csv, os, time
import sys
from bs4 import BeautifulSoup
import urllib
import xlsxwriter
from selenium import webdriver
from importlib import reload

file_path = "C:/temp/temp29/"
file_name = "ASX_20180621_lite.txt"
file_path_name = file_path + file_name
print(file_path_name)

# Phase 1 - place all ticker symbols into an array
tickers_phase1_arr = []

with open(file_path_name, "rt") as incsv:
    readcsv = csv.reader(incsv, delimiter=',')
    rownum = 0
    colnum = 0
    for row in readcsv:
        ticker_phase1 = row[rownum]
        ticker_dot_ax = ticker_phase1 + ".AX"
        tickers_phase1_arr.append(ticker_dot_ax)
        #print(ticker)
        rownum + 1
    print(tickers_phase1_arr)


# Phase 2
key_stats_on_stat = ['5 Year Average Dividend Yield']


#Initialise the browser
browser = webdriver.PhantomJS()

tickers_phase2_arr = []
data = {}

for ticker_phase2 in tickers_phase1_arr:
    print(ticker_phase2)
    #time.sleep(5)
    #Set the main and stats url
    url = "https://finance.yahoo.com/quote/{0}/key-statistics?p={0}".format(ticker_phase2)
    #START - This block of code scrapes for the Previous Code value in the Main Page 
    browser.get(url)
    # Run a script that gets all the html in the webpage that the browser got from the get request
    innerHTML = browser.execute_script("return document.body.innerHTML")
    #Turn innerHTML into a BeautifulSoup object to make the components easier to access for scraping
    soup = BeautifulSoup(innerHTML, 'html.parser')
    # Find the Previous Close value
    for stat in key_stats_on_stat:
        page_stat = soup.find(text=stat)
        try:
            page_row = page_stat.find_parent('tr')
            try:
                page_statnum = page_row.find_all('span')[1].contents[0]
            except:
                page_statnum = page_row.find_all('td')[1].contents[0]
        except:
            print('Invalid parent for this element')
            page_statnum = "N/A"
        print(page_statnum)

1 Ответ

0 голосов
/ 01 июля 2018

Есть несколько способов получить элемент td, содержащий требуемое значение из предыдущего элемента td. Один из них - сначала получить элемент span в первом столбце, а затем использовать find_next(), чтобы найти следующий элемент td:

tr.find(text='5 Year Average Dividend Yield').find_next('td').get_text()

, где tr представляет текущую строку.

Другой подход может масштабироваться немного лучше. Если вам потребуется часто выполнять подобные запросы, вы можете создать словарь, в котором значения элементов первого столбца указаны в качестве ключей, а элементы второго столбца - в качестве значений:

data = {}
for tr in soup.find('table').find_all('tr'):
    first_cell, second_cell = tr.find_all('td')[:2]

    data[first_cell.get_text(strip=True)] = second_cell.get_text(strip=True)

Затем вы можете запросить data по тексту первого столбца:

print(data['5 Year Average Dividend Yield'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...