Question

Voici le code de Spyder1 que j'ai essayé d'écrire dans le cadre 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 regex dans les rules extrait avec succès toutes les bio urls que je souhaite depuis l'URL de départ:

>>> 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']
>>>

Mais quand je lance le code, je reçois

[wc2] ERROR: Error processing FirmItem(school=[]) - 

[Failure instance: Traceback: <type 'exceptions.IndexError'>: list index out of range

Ceci est le FirmItem dans Items.py

from scrapy.item import Item, Field

class FirmItem(Item):
    school = Field()

    pass

Pouvez-vous m'aider à comprendre où se produit l'erreur d'index?

Il me semble que cela a quelque chose à voir avec SgmLinkExtractor .

J'essaie de faire fonctionner cette araignée depuis des semaines avec Scrapy. Ils ont un excellent tutoriel, mais je suis novice en programmation python et web, donc je ne comprends pas comment, par exemple, SgmlLinkExtractor fonctionne en arrière-plan.

Est-ce que ce serait plus facile pour moi d’essayer d’écrire une araignée avec les mêmes fonctionnalités simples avec des bibliothèques Python? J'apprécierais vos commentaires et votre aide.

Merci

Était-ce utile?

La solution

SgmlLinkExtractor ne prend pas en charge les sélecteurs dans son " autoriser " argument.

Donc, c'est faux:

SgmlLinkExtractor(allow=["hxs.select('//td[@class='altRow'] ...')"])

C’est vrai:

SgmlLinkExtractor(allow=[r"product\.php"])

Autres conseils

La fonction d'analyse est appelée pour chaque correspondance de votre SgmlLinkExtractor.

Comme Pablo l’a mentionné, vous souhaitez simplifier votre SgmlLinkExtractor.

J'ai également essayé de mettre les noms extraits de l'URL initiale dans une liste, puis de transmettre chaque nom à analyser sous la forme d'une URL absolue, sous la forme http://www.whitecase.com/aabbas . (pour / aabbas).

Le code suivant parcourt la liste, mais je ne sais pas comment le passer à analyser. Pensez-vous que c'est une meilleure idée?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top