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

Ste*_*ead 17 python urllib2 beautifulsoup web-scraping angularjs

我正在尝试从公共站点asx.com.au获取数据

页面http://www.asx.com.au/asx/research/company.do#!/ACB/details包含一个div类"view-content",它包含我需要的信息:

在此输入图像描述

但是当我尝试通过Python查看此页面时urllib2.urlopendiv为空:

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>
Run Code Online (Sandbox Code Playgroud)

是否可以通过编程方式访问该div的内容?

编辑:根据评论,显示内容通过Angular.js.是否可以通过Python触发该内容的呈现?

fur*_*ras 23

此页面使用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

此URL提供几乎为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'])
Run Code Online (Sandbox Code Playgroud)

输出:

Mineral exploration in Botswana, China and Australia.
Run Code Online (Sandbox Code Playgroud)