2009-11-26 15 views
2

Ceci est le code pour Spyder1 que j'ai essayé d'écrire dans le cadre Scrapy:Scrapy erreur d'index d'araignée

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() 

Le regex dans le rules tire avec succès toutes les urls bio que je veux de 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 que je reçois

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

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

C'est le FirmIt em 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'ai essayé de faire fonctionner cette araignée pendant des semaines avec Scrapy. Ils ont un excellent tutoriel mais je suis novice en programmation python et web donc je ne comprends pas comment fonctionne par exemple SgmlLinkExtractor derrière la scène.

Serait-il plus facile pour moi d'essayer d'écrire une araignée avec la même fonctionnalité simple avec les bibliothèques Python? J'apprécierais tous les commentaires et l'aide.

Merci

+0

Je ne pense pas que ce soit dans le LinkExtractor du tout; il me semble que c'est quelque chose qui est impliqué dans la méthode d'analyse, qui cherche l'école d'où vient le diplôme. – inklesspen

+0

Ok. Ensuite, je pense, je dois ajouter une boucle for à analyser afin qu'il cherche le JD dans chacune des URL renvoyées par le LinkExtractor? Mais je ne comprends pas vraiment la relation entre LinkExtractor et parse. Le didacticiel ici http://doc.scrapy.org/intro/tutorial.html#extracting-the-data possède l'analyse for loop mais utilise des hxs imbriqués. Ce n'est pas clair comment je peux implémenter cela dans mon cas, où j'ai seulement 1 regex. – Zeynel

+0

Utilisez toujours le littéral brut pour les chaînes pouvant contenir des expressions rationnelles, par exemple, au lieu de '\ w +' utilisez r '\ w +'. – jfs

Répondre

1

SgmlLinkExtractor ne supporte pas les sélecteurs dans son argument "permettre".

Donc, cela est faux:

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

Ce droit est:

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

Ok, merci. J'ai simplifié SgmLinkExtractor en écrivant juste un nom: rules = (Règle (SgmlLinkExtractor (allow = ["/ aabbas"]), callback = 'parse'),) mais j'ai toujours le même "index hors de portée" Erreur. De quoi ai-je besoin pour faire ce travail? – Zeynel

+0

si autoriser ne permet pas les sélecteurs puis-je passer à des éléments d'une liste? – Zeynel

+0

comme SgmlLinkExtractor (allow = ["nom"])? où le nom est "/ aabbas" – Zeynel

0

La fonction d'analyse syntaxique est appelée pour chaque match de votre SgmlLinkExtractor. Comme Pablo mentionné que vous voulez simplifier votre SgmlLinkExtractor.

+0

Ok, comme j'ai répondu à Pablo, je l'ai essayé avec juste l'un des noms/aabbas. Mais je reçois toujours l'erreur hors de l'index. Pouvez-vous aider comment j'ai besoin de reformuler LinkExtractor au travail. Si cela fonctionne, j'essaierai de l'affiner plus tard. Merci. – Zeynel

+0

ok, donc le match devrait être/aabbas. Qu'est-ce que la fonction d'analyse obtient pour ce match? – Zeynel

0

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

Le code suivant boucle sur la liste, mais je ne sais pas comment 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