2015-04-04 31 views
1

我正試圖抓取新的ESPN NBA記分牌。下面是一個簡單的腳本,它應該返回的開始時間爲所有的遊戲在15年4月5日:使用xpath刮蹭新的ESPN網站[Python]

import requests 
import lxml.html 
from lxml.cssselect import CSSSelector 

doc = lxml.html.fromstring(requests.get('http://scores.espn.go.com/nba/scoreboard?date=20150405').text) 

#xpath 
print doc.xpath("//title/text()") #print page title 
print doc.xpath("//span/@time") 
print doc.xpath("//span[@class='time']") 
print doc.xpath("//span[@class='time']/text()") 

#CCS Selector 
sel = CSSSelector('span.time') 
for i in sel(doc): 
    print i.text 

它不返回任何東西,但頁面標題:

['NBA Basketball Scores - NBA Scoreboard - ESPN'] 
[] 
[] 
[] 

任何人的幫助?謝謝

+0

我寫的東西,擦傷espn nba,https://github.com/GiannisIordanou/ESPN-NBA – GiannisIordanou 2015-04-04 08:47:32

回答

5

頁面的性質是相當動態 - 有異步XHR請求,涉及的JavaScript邏輯。 requests不是瀏覽器,只下載最初的HTML頁面,requests獲取的HTML中沒有span元素,其中class="time"

解決此問題的方法之一是使用selenium來使用真正的瀏覽器。下面是使用PhantomJS模擬瀏覽器的例子:

>>> from selenium import webdriver 
>>> 
>>> url = "http://scores.espn.go.com/nba/scoreboard?date=20150405" 
>>> 
>>> driver = webdriver.PhantomJS() 
>>> driver.get(url) 
>>> 
>>> elements = driver.find_elements_by_css_selector("span.time") 
>>> for element in elements: 
...  print element.text 
... 

1:00 PM ET 
3:30 PM ET 
6:00 PM ET 
7:00 PM ET 
7:30 PM ET 
9:00 PM ET 
9:30 PM ET 

或者,你可以尋找所需數據的divid="scoreboard-page"data-data屬性:

import json 
from pprint import pprint 

import lxml.html 
import requests 

response = requests.get('http://scores.espn.go.com/nba/scoreboard?date=20150405') 
doc = lxml.html.fromstring(response.content) 

data = doc.xpath("//div[@id='scoreboard-page']/@data-data")[0] 
data = json.loads(data) 

pprint(data) 
+0

感謝您的解決方案。還有哪些其他選項不涉及使用真正的瀏覽器? – jdesilvio 2015-04-04 02:24:06

+0

這太好了,謝謝。我希望我能給你2個正確的答案檢查! – jdesilvio 2015-04-04 03:33:11

+0

這真是一個很棒的答案! – user770901 2016-12-01 21:12:04