使用xpath[Python]删除新的ESPN站点



我正在努力争取新的ESPN NBA记分牌。这里有一个简单的脚本,它应该返回2015年4月5日所有游戏的开始时间:

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

有人能帮忙吗?感谢

页面的性质是动态的-有异步XHR请求,涉及javascript逻辑。requests不是浏览器并且仅下载初始HTML页面,并且在requests获得的HTML中不存在具有class="time"span元素。

解决这个问题的一个选项是使用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 

或者,您可以使用id="scoreboard-page":在divdata-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)

最新更新