Очистите стандартное отклонение от Yahoo Finance, используя Beautiful Soup - PullRequest
0 голосов
/ 21 сентября 2018

Я пытаюсь почистить некоторые цифры из таблицы статистики рисков на веб-странице финансов Yahoo, используя BeautifulSoup и Python 2.7: https://finance.yahoo.com/quote/SHSAX/risk

enter image description here

До сих пор я просматривал html, используя https://codebeautify.org:

enter image description here

#!/usr/bin/python
from bs4 import BeautifulSoup, Comment
import urllib

riskURL = "https://finance.yahoo.com/quote/SHSAX/risk"
page = urllib.urlopen(riskURL)
content = page.read().decode('utf-8')
soup = BeautifulSoup(content, 'html.parser')

Моя проблема на самом деле - получить числа с помощью soup.find,Например, стандартное отклонение:

    # std should be 13.44
    stdevValue = float(soup.find("span",{"data-reactid":"124","class":"W(39%) Fl(start)"}).text)
    # std of category should be 0.18
    stdevCat = float(soup.find("span",{"data-reactid":"125","class":"W(57%) Mend(5px) Fl(end)"}).text)

Оба эти вызова в sou.find не возвращают ни одного.Чего мне не хватает?

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Из того, что я прочитал в Интернете, «data-реагирование» - это пользовательский атрибут, используемый каркасом реагирования для ссылки на компоненты (вы можете прочитать больше здесь что такое атрибут data-реагирование в html? ) и послеЧерез пару попыток я заметил, что при каждой перезагрузке страницы атрибуты реагирования на данные различаются, например, генерируются случайным образом.

Я думаю, вам следует попытаться найти другой подход для достижения этой цели.

Может бытьВы можете попытаться найти определенный элемент, например строку «Стандартное отклонение», а затем выполнить цикл для сбора данных.

std_span = next(x for x in soup.find_all('span') if x.text == "Standard Deviation")
parent_div = std_span.parent
for sibling in parent_div.next_siblings:
   for child in sibling.children:
      # do something
      print(child.text)

Надеюсь, это поможет.

0 голосов
/ 21 сентября 2018
from bs4 import BeautifulSoup, Comment
import urllib


riskURL = "https://finance.yahoo.com/quote/SHSAX/risk"
page = urllib.request.urlopen(riskURL)
content = page.read().decode('utf-8')
soup = BeautifulSoup(content, 'html.parser')
#W(25%) Fl(start) Ta(e)
results = soup.find("span", {"data-reactid" : "121"})
print results.text

В качестве альтернативы вы можете использовать регулярное выражение и findNext, чтобы получить значение:

from bs4 import BeautifulSoup, Comment
import urllib


riskURL = "https://finance.yahoo.com/quote/SHSAX/risk"
page = urllib.request.urlopen(riskURL)
content = page.read().decode('utf-8')
soup = BeautifulSoup(content, 'html.parser')
for span in soup.find_all('span',text=re.compile('^(Standard Deviation)')):
    print span.findNext('span').text
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...