Erreur d'index d'araignée Scrapy
-
05-07-2019 - |
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
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