python - Raspando el nuevo sitio de ESPN usando xpath
web-scraping lxml (1)
La naturaleza de la página es bastante dinámica: hay solicitudes XHR asíncronas, implica la lógica de JavaScript. requests
no es un navegador y descarga solo la página HTML inicial y no hay elementos span
con class="time"
en el HTML que obtiene requests
.
Una de las opciones para abordar el problema sería involucrar a un navegador real usando selenium
. Aquí hay un ejemplo usando el navegador sin cabeza 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
Alternativamente, puede buscar los datos deseados en el atributo data-data
del div
con 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)
Estoy tratando de raspar el nuevo marcador de ESPN NBA. Aquí hay un script simple que debe devolver las horas de inicio de todos los juegos el 4/5/15:
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
No devuelve nada, pero el título de la página:
[''NBA Basketball Scores - NBA Scoreboard - ESPN'']
[]
[]
[]
¿Alguien puede ayudar? Gracias