W komentarzach napisano, że przeniosły się do ReactJS, więc lxml
nie jest już do rzeczy, ponieważ nie ma danych na stronie HTML. Teraz musisz rozejrzeć się i znaleźć punkt końcowy, z którego czerpią dane. W przypadku Trendów rekomendacji jest tam.
#!/usr/bin/env python3
import json
from pprint import pprint
from urllib.request import urlopen
from urllib.parse import urlencode
def parse():
host = 'https://query2.finance.yahoo.com'
path = '/v10/finance/quoteSummary/CSX'
params = {
'formatted' : 'true',
'lang' : 'en-US',
'region' : 'US',
'modules' : 'recommendationTrend'
}
response = urlopen('{}{}?{}'.format(host, path, urlencode(params)))
data = json.loads(response.read().decode())
pprint(data)
if __name__ == '__main__':
parse()
Wynik wygląda następująco.
{
'quoteSummary': {
'error': None,
'result': [{
'recommendationTrend': {
'maxAge': 86400,
'trend': [{
'buy': 0,
'hold': 0,
'period': '0w',
'sell': 0,
'strongBuy': 0,
'strongSell': 0
},
{
'buy': 0,
'hold': 0,
'period': '-1w',
'sell': 0,
'strongBuy': 0,
'strongSell': 0
},
{
'buy': 5,
'hold': 12,
'period': '0m',
'sell': 2,
'strongBuy': 6,
'strongSell': 1
},
{
'buy': 5,
'hold': 12,
'period': '-1m',
'sell': 2,
'strongBuy': 7,
'strongSell': 1
},
{
'buy': 6,
'hold': 11,
'period': '-2m',
'sell': 2,
'strongBuy': 8,
'strongSell': 1
},
{
'buy': 6,
'hold': 11,
'period': '-3m',
'sell': 2,
'strongBuy': 8,
'strongSell': 1
}]
}
}]
}
}
Jak szukać danych
co zrobiłem było z grubsza:
- Znajdź jakiś unikalny token w widgecie docelowej (słownie wartość wykres lub Trend string)
- Otwórz źródło strony (użyj jakiegoś formatyzatora dla HTML i JS, np. this)
- Poszukaj tokena tam (w e strona trzecia to sekcja zaczynająca się od
/* -- Data -- */
)
- Wyszukaj ".js", aby uzyskać znaczniki skryptu (lub programowe włączania, np. wymagać.js) i poszukać tokena tam
- Otwórz zakładkę sieć w Firebug lub chrom Developer Tools i skontrolować XHR żąda
- Następnie użyj Postman (lub curl jeśli wolisz terminalu) rozebrać dodatkowych parametrów i zobaczyć jak wygląda końcowy reaguje
Z pamięci zaczęli używać reagowania, więc wiele treści jest teraz dynamicznie tworzonych, w jaki sposób otrzymujesz źródło? –
Umieściłem kod w pytaniu. Wygląda na to, że treść jest tworzona dynamicznie. Sądzę, że zastanawiam się, czy takie treści i tak można wyciągnąć. –
tak, właśnie obejrzałem, jest całkowicie dynamicznie stworzony, w tym kolorowanki itp. Można dość łatwo uzyskać wartości przy użyciu selenu choć –