Error de índice de araña Scrapy
-
05-07-2019 - |
Pregunta
Este es el código para Spyder1 que he estado intentando escribir en el marco de Scrapy:
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.selector import HtmlXPathSelector
from scrapy.item import Item
from firm.items import FirmItem
class Spider1(CrawlSpider):
domain_name = 'wc2'
start_urls = ['http://www.whitecase.com/Attorneys/List.aspx?LastName=A']
rules = (
Rule(SgmlLinkExtractor(allow=["hxs.select(
'//td[@class='altRow'][1]/a/@href').re('/.a\w+')"]),
callback='parse'),
)
def parse(self, response):
hxs = HtmlXPathSelector(response)
JD = FirmItem()
JD['school'] = hxs.select(
'//td[@class="mainColumnTDa"]').re('(?<=(JD,\s))(.*?)(\d+)'
)
return JD
SPIDER = Spider1()
La expresión regular en rules
extrae con éxito todas las bio urls que deseo desde el inicio url:
>>> hxs.select(
... '//td[@class="altRow"][1]/a/@href').re('/.a\w+')
[u'/cabel', u'/jacevedo', u'/jacuna', u'/aadler', u'/zahmedani', u'/tairisto', u
'/zalbert', u'/salberts', u'/aaleksandrova', u'/malhadeff', u'/nalivojvodic', u'
/kallchurch', u'/jalleyne', u'/lalonzo', u'/malthoff', u'/valvarez', u'/camon',
u'/randerson', u'/eandreeva', u'/pangeli', u'/jangland', u'/mantczak', u'/darany
i', u'/carhold', u'/marora', u'/garrington', u'/jartzinger', u'/sasayama', u'/ma
sschenfeldt', u'/dattanasio', u'/watterbury', u'/jaudrlicka', u'/caverch', u'/fa
yanruoh', u'/razar']
>>>
Pero cuando ejecuto el código, obtengo
[wc2] ERROR: Error processing FirmItem(school=[]) -
[Failure instance: Traceback: <type 'exceptions.IndexError'>: list index out of range
Este es el artículo de firma en Items.py
from scrapy.item import Item, Field
class FirmItem(Item):
school = Field()
pass
¿Puede ayudarme a comprender dónde se produce el error de índice?
Me parece que tiene algo que ver con SgmLinkExtractor .
He estado tratando de hacer que esta araña funcione durante semanas con Scrapy. Tienen un excelente tutorial, pero soy nuevo en Python y en la programación web, así que no entiendo cómo, por ejemplo, SgmlLinkExtractor
funciona detrás de la escena.
¿Sería más fácil para mí intentar escribir una araña con la misma funcionalidad simple con las bibliotecas de Python? Agradecería cualquier comentario y ayuda.
Gracias
Solución
SgmlLinkExtractor no admite selectores en su " permitir " argumento.
Esto está mal:
SgmlLinkExtractor(allow=["hxs.select('//td[@class='altRow'] ...')"])
Esto es correcto:
SgmlLinkExtractor(allow=[r"product\.php"])
Otros consejos
Se llama a la función de análisis para cada coincidencia de su SgmlLinkExtractor.
Como Pablo mencionó, usted quiere simplificar su SgmlLinkExtractor.
También intenté poner los nombres extraídos de la url inicial en una lista y luego pasar cada nombre para analizar en la forma de url absoluta como http://www.whitecase.com/aabbas
(para / aabbas).
El siguiente código recorre la lista, pero no sé cómo pasar esto para analizar. ¿Crees que esta es una mejor idea?
baseurl = 'http://www.whitecase.com'
names = ['aabbas', '/cabel', '/jacevedo', '/jacuna', '/igbadegesin']
def makeurl(baseurl, names):
for x in names:
url = baseurl + x
baseurl = 'http://www.whitecase.com'
x = ''
return url