使用 xpath [Python] 抓取新的 ESPN 网站
Scraping new ESPN site using xpath [Python]
我正在尝试抓取新的 ESPN NBA 记分牌。这是一个简单的脚本,它应该 return 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
它没有 return 任何东西,但是页面标题:
['NBA Basketball Scores - NBA Scoreboard - ESPN']
[]
[]
[]
有人可以帮忙吗?谢谢
页面的性质非常动态 - 有异步 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
或者,您可以使用 id="scoreboard-page"
:
在 div
的 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)
我正在尝试抓取新的 ESPN NBA 记分牌。这是一个简单的脚本,它应该 return 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
它没有 return 任何东西,但是页面标题:
['NBA Basketball Scores - NBA Scoreboard - ESPN']
[]
[]
[]
有人可以帮忙吗?谢谢
页面的性质非常动态 - 有异步 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
或者,您可以使用 id="scoreboard-page"
:
div
的 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)