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

¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top