gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 08:56:47 26 4
gpt4 key购买 nike

我正在尝试抓取新的 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)

关于python - 使用 xpath [Python] 抓取新的 ESPN 站点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29441855/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com