2016-01-28 15 views
6

Próbuję zeskrobać dane ze strony publicznej asx.com.auWeb scraping - jak uzyskać dostęp do treści renderowanych w JavaScript przez Angular.js?

Strona http://www.asx.com.au/asx/research/company.do#!/ACB/details zawiera div z klasą „Widok-content”, który posiada informacje potrzebne:

enter image description here

ale kiedy staram się, by zobaczyć tę stronę za pomocą Pythona urllib2.urlopen że div jest pusta:

import urllib2 
from bs4 import BeautifulSoup 

url = 'http://www.asx.com.au/asx/research/company.do#!/ACB/details' 
page = urllib2.urlopen(url).read() 
soup = BeautifulSoup(page, "html.parser") 
contentDiv = soup.find("div", {"class": "view-content"}) 
print(contentDiv) 

# the results is an empty div: 
# <div class="view-content" ui-view=""></div> 

Czy to możliwe, aby uzyskać dostęp zawartość tego div programowo?

Edytuj: zgodnie z komentarzem wydaje się, że treść jest renderowana przez Angular.js. Czy możliwe jest wyzwolenie renderowania tej treści przez Python?

+0

widzę 'ng-scope' - to nazwa przez stosowanie ram' AngularJS' (lub podobnego ram) więc ta strona jest generowana przez JavaScript. – furas

+0

@furas biorąc pod uwagę, że być może jest to duplikat http://stackoverflow.com/questions/30673447/fetch-text-from-web-withangular-js-tags-such-as-ng-view i potrzebuję używać Selenium lub podobnego? –

+1

Nie potrzebujesz selenu, który już posiada adres URL w mojej odpowiedzi i możesz go uzyskać za pomocą 'urrlib' i' json' :) Pracuję nad przykładem kodu. – furas

Odpowiedz

13

Ta strona używa JavaScript do odczytywania danych z serwera i wypełniania strony.

Widzę, że używasz narzędzi programistycznych w chrome - patrz w zakładce "Sieć" na żądanie "XHR" lub "JS".

znalazłem ten link

http://data.asx.com.au/data/1/company/ACB?fields=primary_share,latest_annual_reports,last_dividend,primary_share.indices&callback=angular.callbacks._0

Ten url daje wszystkie dane niemal w formacie JSON

Ale jeśli używasz tego linku bez &callback=angular.callbacks._0 następnie można uzyskać dane w czystym formacie JSON i będzie mógł użyj modułu json, aby przekonwertować go do słownika Pythona.


EDIT: kod roboczych

import urllib2 
from bs4 import BeautifulSoup 
import json 

# new url  
url = 'http://data.asx.com.au/data/1/company/ACB?fields=primary_share,latest_annual_reports,last_dividend,primary_share.indices' 

# read all data 
page = urllib2.urlopen(url).read() 

# convert json text to python dictionary 
data = json.loads(page) 

print(data['principal_activities']) 

wyjściowa:

Mineral exploration in Botswana, China and Australia. 
+0

Wielkie dzięki za szybką i szczegółową odpowiedź! To jest niesamowite. –

+0

w nowym adresie URL należy użyć innej nazwy firmy zamiast "ACB", a otrzymasz dane dla tej firmy – furas

Powiązane problemy