2009-11-27 16 views
9

J'essaie de faire fonctionner le SgmlLinkExtractor.Scrapy SgmlLinkExtractor question

C'est la signature:

SgmlLinkExtractor(allow=(), deny=(), allow_domains=(), deny_domains=(), restrict_xpaths(), tags=('a', 'area'), attrs=('href'), canonicalize=True, unique=True, process_value=None) 

Je suis juste en utilisant allow=()

Alors, j'entre

rules = (Rule(SgmlLinkExtractor(allow=("/aadler/",)), callback='parse'),) 

Ainsi, l'URL initiale est 'http://www.whitecase.com/jacevedo/' et je suis entrée allow=('/aadler',) et attendre que '/aadler/' sera également numérisé. Mais au lieu de cela, l'araignée balaye l'URL initiale, puis se ferme:

[wcase] INFO: Domain opened 
[wcase] DEBUG: Crawled </jacevedo/> (referer: <None>) 
[wcase] INFO: Passed NuItem(school=[u'JD, ', u'Columbia Law School, Harlan Fiske Stone Scholar, Parker School Recognition of Achievement in International and Foreign Law, ', u'2005']) 
[wcase] INFO: Closing domain (finished) 

Qu'est-ce que je fais mal ici?

Y at-il quelqu'un ici qui a utilisé avec succès Scrapy qui peut m'aider à finir cette araignée?

Merci pour votre aide.

I comprennent le code pour l'araignée ci-dessous:

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 Nu.items import NuItem 
from urls import u 

class NuSpider(CrawlSpider): 
    domain_name = "wcase" 
    start_urls = ['xxxxxx/jacevedo/'] 

    rules = (Rule(SgmlLinkExtractor(allow=("/aadler/",)), callback='parse'),) 

    def parse(self, response): 
     hxs = HtmlXPathSelector(response) 

     item = NuItem() 
     item['school'] = hxs.select('//td[@class="mainColumnTDa"]').re('(?<=(JD,\s))(.*?)(\d+)') 
     return item 

SPIDER = NuSpider() 

Note: SO ne me laisse pas poster plus de 1 url donc remplacer l'URL initiale si nécessaire. Désolé pour ça.

Répondre

10

Vous redéfinissant la méthode "analyser" il apparaît. "Parse", est une méthode privée dans CrawlSpider utilisé pour suivre les liens.

+1

Voulez-vous dire cette ligne:... rappel = 'parse' – Zeynel

+0

Oui, n'utilisez pas le callback "parse" dans votre CrawlSpider Rule –

+0

Et changez votre méthode 'parse' en' parse_item' – Eduardo

1

permettent = (r '/ aadler /', ...

+1

ok, mais rien n'a changé crawls encore que l'URL initiale – Zeynel

1

Il vous manque une virgule après le premier élément de « règles » pour un tuple ..

rules = (Rule(SgmlLinkExtractor(allow=('/careers/n.\w+',)), callback='parse', follow=True),) 
3

si vous consultez la documentation d'un « avertissement » est clairement écrit

"Lors de l'écriture de règles spider, évitez d'utiliser l'analyse comme callback, puisque le Crawl Spider utilise lui-même la méthode parse pour implémenter sa logique. Donc, si vous substituez la méthode d'analyse syntaxique, l'araignée crawl ne fonctionnera plus «

url for verification