2016-01-28 12 views
6

sto cercando di raschiare i dati dal sito pubblico asx.com.auRaschiamento del web: come accedere al contenuto reso in JavaScript tramite Angular.js?

La pagina contiene una http://www.asx.com.au/asx/research/company.do#!/ACB/detailsdiv con classe 'vista-content', che ha l'informazioni che mi servono:

enter image description here

Ma quando io cerco di visualizzare questa pagina tramite Python urllib2.urlopen che div è vuota:

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> 

E 'possibile l'accesso il contenuto di quel div a livello di programmazione?

Modifica: come da commento sembra che il contenuto sia reso tramite Angular.js. È possibile attivare il rendering di quel contenuto tramite Python?

+0

vedo 'ng-scope' - è l'uso nome dal quadro' AngularJS' (o simile quadro) quindi questa pagina è generata da JavaScript. – furas

+0

@furas dato che, forse questo è un duplicato di http://stackoverflow.com/questions/30673447/fetch-text-from-web-with-angular-js-tags-such-as-ng-view e ho bisogno usare il selenio o simili? –

+1

non hai bisogno del selenio hai già url nella mia risposta e puoi ottenerlo usando 'urrlib' e' json' :) Sto lavorando all'esempio di codice. – furas

risposta

13

Questa pagina utilizza JavaScript per leggere i dati dal server e la pagina di riempimento.

Vedo che utilizzi gli strumenti di sviluppo in chrome - vedi nella scheda "Rete" sulle richieste "XHR" o "JS".

Ho trovato questo URL

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

Questo url dà tutti i dati quasi in formato JSON

Ma se si utilizza questo link senza &callback=angular.callbacks._0 quindi si ottiene dati in formato puro JSON e si poteva sarà utilizzare il modulo json per convertirlo in dizionario Python.


EDIT: codice funzionante

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']) 

uscita:

Mineral exploration in Botswana, China and Australia. 
+0

Mille grazie per la risposta veloce e dettagliata! Questo e spettacolare. –

+0

nel nuovo url devi usare un altro nome di azienda al posto di 'ACB' e ottieni dati per questa azienda – furas

Problemi correlati