web-dev-qa-db-fra.com

Web scraping - comment accéder au contenu rendu en JavaScript via Angular.js?

J'essaye de gratter les données du site public asx.com.a

La page http://www.asx.com.au/asx/research/company.do#!/ACB/details contient un div avec la classe 'view-content', qui a les informations dont j'ai besoin:

enter image description here

Mais quand j'essaie de visualiser cette page via le urllib2.urlopen De Python, cette div est vide:

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>

Est-il possible d'accéder au contenu de cette div par programme?

Modifier: selon le commentaire, il apparaît que le contenu est rendu via Angular.js. Est-il possible de déclencher le rendu de ce contenu via Python?

19
Stephen Lead

Cette page utilise JavaScript pour lire les données du serveur et remplir la page.

Je vois que vous utilisez des outils de développement dans chrome - voir dans l'onglet "Réseau" sur les demandes "XHR" ou "JS".

J'ai trouvé cette URL

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

Cette URL donne toutes les données presque au format JSON

Mais si vous utilisez ce lien sans &callback=angular.callbacks._0 alors vous obtenez des données au format JSON pur et vous pouvez utiliser le module json pour les convertir en dictionnaire python.


EDIT: code de travail

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

Production:

Mineral exploration in Botswana, China and Australia.
24
furas