web-dev-qa-db-ja.com

Webスクレイピング-Angular.jsを介してJavaScriptでレンダリングされたコンテンツにアクセスする方法

公開サイトからデータを取得しようとしています asx.com.a

ページ http://www.asx.com.au/asx/research/company.do#!/ACB/details には、クラス 'view-content'を持つdivが含まれています。私が必要とする情報があります:

enter image description here

しかし、Pythonのurllib2.urlopenを介してこのページを表示しようとすると、divが空になります。

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>

プログラムでそのdivのコンテンツにアクセスすることは可能ですか?

編集:コメントのとおり、コンテンツはAngular.js経由でレンダリングされているようです。 Pythonを介してそのコンテンツのレンダリングをトリガーすることは可能ですか?

19
Stephen Lead

このページは、JavaScriptを使用してサーバーからデータを読み取り、ページに入力します。

chrome-「XHR」または「JS」リクエストの「ネットワーク」タブを参照してください。

このURLを見つけました

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

このURLはほとんどすべてのデータをJSON形式で提供します

しかし、このリンクを&callback=angular.callbacks._0なしで使用すると、純粋なJSON形式のデータが得られ、jsonモジュールを使用してpython辞書に変換できます。


EDIT:作業コード

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

出力:

Mineral exploration in Botswana, China and Australia.
24
furas