Skip to main content
 首页 » 编程设计

python之使用 xpath [Python] 抓取新的 ESPN 站点

2025年05月04日49txw1958

我正在尝试抓取新的 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 页面,HTML 中没有 span 元素 class="time" 请求获取。

解决该问题的方法之一是让真正的浏览器使用 selenium .下面是一个使用 PhantomJS headless 浏览器的例子:

>>> 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  

或者,您可以在 divdata-data 属性中使用 id="scoreboard-page" 查找所需的数据:

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)