выскабливание с помощью элементов, скрывающих красивые пары - PullRequest
0 голосов
/ 03 ноября 2018

Я пытаюсь очистить следующий URL с помощью BeautifulSoup: https://www.investopedia.com/markets/stocks/aapl/#Financials

Я попытался разобрать этот раздел, который я нашел с inspect:

     <div class="value">
          <div class="marker position" style="left: 89.25%;"></div>
          <div class="text position" style="left: 89.25%;">1.43</div>
     </div>

Мой код выглядит следующим образом:

import bs4 as bs
import requests

def load_ticker_invest(ticker):
resp = requests.get('https://www.investopedia.com/markets/stocks/{}/#Financials'.format(ticker))
    soup = bs.BeautifulSoup(resp.text, 'html.parser')
    trend = soup.div.find_all('div', attrs={'class':'value'})

    return trend

print (load_ticker_invest('aapl'))

В результате я получаю пустой список:

[]

Как я могу решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 04 ноября 2018
import requests
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
import bs4 as bs

caps = DesiredCapabilities().CHROME
caps["pageLoadStrategy"] = "normal"
driver = webdriver.Chrome(desired_capabilities=caps)
driver.get('https://www.investopedia.com/markets/stocks/aapl/#Financials')
resp = driver.execute_script('return document.documentElement.outerHTML')
driver.quit()

soup = bs.BeautifulSoup(resp, 'html.parser')
res = soup.find('div', attrs={'class':'text position'}).text
print (res)
0 голосов
/ 04 ноября 2018

Этот сайт использует внутренний API для получения этих данных, для этого вызова API требуются некоторые токены, которые встроены в некоторый Javascript-скрипт внутри страницы https://www.investopedia.com/markets/stocks/aapl, поэтому вам нужно сначала удалить эти значения, используя некоторое регулярное выражение, а затем использовать их в вызове API

Использование скрипта bash с , , и :

title=aapl

IFS=' ' read token token_userid < <(curl -s "https://www.investopedia.com/markets/stocks/$title/" | \
     tr -d '\n' | \
     sed -rn "s:.*Xignite\(\s*'([A-Z0-9]+)',\s*'([A-Z0-9]+)'.*:\1 \2:p")

curl -s "https://factsetestimates.xignite.com/xFactSetEstimates.json/GetLatestRecommendationSummaries?IdentifierType=Symbol&Identifiers=$title&UpdatedSince=&_token=$token&_token_userid=$token_userid" | \
     jq -r '.[].RecommendationSummarySet | .[].RecommendationScore'

Использование :

import requests
import re

ticker = 'aapl'

r = requests.get('https://www.investopedia.com/markets/stocks/{}/'.format(ticker))

result = re.search(r".*Xignite\(\s*'([A-Z0-9]+)',\s*'([A-Z0-9]+)'", r.text)

token = result.group(1)
token_userid = result.group(2)

r = requests.get('https://factsetestimates.xignite.com/xFactSetEstimates.json/GetLatestRecommendationSummaries?IdentifierType=Symbol&Identifiers={}&UpdatedSince=&_token={}&_token_userid={}'
    .format(ticker, token, token_userid)
)

print(r.json()[0]['RecommendationSummarySet'][0]['RecommendationScore'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...