2016-01-28 15 views
6

Tôi đang cố gắng để trích xuất dữ liệu từ các trang web công cộng asx.com.auDò web - cách truy cập nội dung được hiển thị bằng JavaScript qua Angular.js?

Trang http://www.asx.com.au/asx/research/company.do#!/ACB/details chứa một div với lớp 'xem nội dung', trong đó có thông tin mà tôi cần:

enter image description here

Nhưng khi Tôi cố gắng xem trang này qua số urllib2.urlopen của Python mà div trống:

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> 

Có thể truy cập nội dung của div đó theo chương trình?

Chỉnh sửa: theo nhận xét có vẻ như nội dung được hiển thị qua Angular.js. Có thể kích hoạt hiển thị nội dung đó qua Python không?

+0

tôi thấy 'ng-scope' - đó là tên sử dụng bởi khuôn khổ 'AngularJS' (hoặc khung tương tự) do đó, trang này được tạo bởi JavaScript. – furas

+0

@furas cho rằng, có lẽ đây là bản sao của http://stackoverflow.com/questions/30673447/fetch-text-from-web-with-angular-js-tags-such-as-ng-view và tôi cần sử dụng Selenium hoặc tương tự? –

+1

bạn không cần selen mà bạn đã có url trong câu trả lời của tôi và bạn có thể lấy nó bằng cách sử dụng 'urrlib' và' json' :) Tôi đang làm việc trên ví dụ mã. – furas

Trả lời

13

Trang này sử dụng JavaScript để đọc dữ liệu từ máy chủ và trang điền.

Tôi thấy bạn sử dụng công cụ nhà phát triển trong chrome - xem trong tab "Mạng" trên yêu cầu "XHR" hoặc "JS".

tôi thấy url này

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 này mang đến cho tất cả các dữ liệu gần như ở định dạng JSON

Nhưng nếu bạn sử dụng liên kết này mà không &callback=angular.callbacks._0 sau đó bạn sẽ có được dữ liệu ở định dạng JSON tinh khiết và bạn sẽ có thể sử dụng mô-đun json để chuyển đổi nó thành từ điển python.


EDIT: làm việc mã

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

Output:

Mineral exploration in Botswana, China and Australia. 
+0

Cảm ơn rất nhiều vì phản hồi nhanh và chi tiết! Điều này thật tuyệt. –

+0

trong url mới, bạn phải sử dụng tên công ty khác thay cho 'ACB' và bạn nhận dữ liệu cho công ty này – furas

Các vấn đề liên quan