Tengo este código que raspa una tabla con resultados, el ganador está resaltado en una fuente roja y el perdedor es solo texto. Aquí está el enlace al sitio web que estoy raspado.
Así es como se ve:

winner_2 = selector.xpath('.//table[1]/tr[3]/td[4]/font/text()').extract()[0]
loser_2 = selector.xpath('.//table[1]/tr[3]/td[4]/text()').extract()[0]
print (winner_2 + loser_2)

Esto es lo que sale:

New Zealand v Australia

Pero a veces no hay un ganador ni un perdedor (es decir, un empate) y todo el texto es solo texto sin fuente. En ese caso, devuelve el ganador con IndexError: índice de lista fuera de rango (porque el texto con fuente no existe) y el perdedor son ambos equipos, que es lo que necesito.
¿Cómo puedo hacer que compruebe si existe un ganador y, si no existe, imprima el perdedor?

1
Alexei Dom 4 sep. 2017 a las 18:00

2 respuestas

La mejor respuesta

En este caso, usaría extract_first():

winner_2 = selector.xpath('.//table[1]/tr[3]/td[4]/font/text()').extract_first()
loser_2 = selector.xpath('.//table[1]/tr[3]/td[4]/text()').extract_first()
if winner_2 and loser_2:
    print(winner_2 + loser_2) 
else:
    print(loser_2)

De esta forma evitamos el IndexError. Si falta algún dato, será None, lo cual es lógico, supongo.

3
M3RS 9 sep. 2017 a las 17:13

Alternativamente, si observa que los elementos divididos terminan o comienzan con un espacio en blanco, puede hacerlo de esta manera.

>>> import requests
>>> page = requests.get('http://www.lassen.co.nz/pickandgo.php?fyear=q&teama=NZL#hrh').content
>>> from scrapy.selector import Selector
>>> selector = Selector(text=page)
>>> for item in selector.xpath('.//td[@class="lftblu"]/text()'):
...     if item.extract().startswith(' ') or item.extract().endswith(' '):
...         continue
...     item.extract()
...     
'New Zealand v British Isles'
2
Bill Bell 4 sep. 2017 a las 15:27