Web抓取 - 如何通过Angular.js访问用JavaScript呈现的内容?

时间:2016-01-28 00:20:58

标签: python angularjs web-scraping beautifulsoup urllib2

我正在尝试从公共网站asx.com.au

抓取数据

页面http://www.asx.com.au/asx/research/company.do#!/ACB/details包含div类,其中包含“view-content”类,其中包含我需要的信息:

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触发该内容的呈现?

1 个答案:

答案 0 :(得分:19)

此页面使用JavaScript从服务器和填充页面读取数据。

我看到您在chrome中使用了开发人员工具 - 请参阅“XHR”或“JS”请求中的“网络”标签。

我找到了这个网址

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

此网址提供几乎采用JSON格式的所有数据

但是,如果您使用此链接而不使用&callback=angular.callbacks._0,那么您将获得纯JSON格式的数据,并且您可以使用json模块将其转换为python字典。

编辑工作代码

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.