python xpath web-scraping lxml lxml.html

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