2012-10-03 23 views
5

He encontrado la respuesta abajo. En resumen, la sangría incorrecta en el ItemPipeline hizo que devuelva None.Scrapy Spider no devuelve ninguno en lugar del artículo

He estado intentando escribir un CrawlSpider en Scrapy, nunca antes había trabajado con python. El Spider rastrea, llama a la función de devolución de llamada, extrae datos y llena el elemento, pero siempre devuelve Ninguno. Lo probé con una llamada a un artículo impreso, todo estaba en orden. He intentado esto con rendimiento y rendimiento (aunque todavía no entiendo la diferencia). Francamente, me he quedado sin ideas. Abajo es la devolución de llamada function.//edit añadió el código de araña, así

class ZeitSpider(CrawlSpider): 
name= xxxx 
allowed_domains = ['example.com'] 
start_urls = ['http://www.example.com/%d/%d' %(JAHR,39)] 
rules = (Rule(SgmlLinkExtractor(restrict_xpaths=('//ul[@class="teaserlist"]/li[@class="archiveteaser"]/h4[@class="title"]')),callback='parse_url',follow=True),) 

def parse_url(self,response): 

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

    article = Article() 

    article['url']= response.url.encode('UTF-8',errors='strict') 

    article['author']= hxs.select('//div[@id="informatives"]/ul[@class="tools"]/li[@class="author first"]/text()').extract().pop().encode('UTF-8',errors='strict') 
    article['title']= hxs.select('//div[@class="articleheader"]/h1/span[@class="title"]/text()').extract().pop().encode('UTF-8',errors='strict') 

    article['text']= hxs.select('//div[@id="main"]/p/text()').extract().pop().encode('UTF-8',errors='strict') 

    article['excerpt'] = hxs.select('//p[@class="excerpt"]/text()').extract().pop().encode('UTF-8',errors='strict') 
    yield article 

y la definición del elemento

class Article(Item): 
    url=Field() 
    author=Field() 
    text=Field() 
    title=Field() 
    excerpt=Field() 

Respuesta

2

Ok, después de entrar en el programa con pdb he encontrado el error:

Como tengo varias arañas, quería escribir varias ItemPipelines. Para hacer que se diferencien por araña, agregué un

if spider.name=='SpiderName' 
    return item 

Observe la sangría. The Pipeline no devolvió nada y, por lo tanto, el resultado pasó a ser None.

Después de cambiar la sangría, la araña funcionó a la perfección. Otro ejemplo de PEBCAC.

+0

GRACIAS. El mensaje de error fue '' NoneType '' no tiene atributo 'iterkeys''. Tal vez puede ayudar a redirigir a Google aquí. – KrisWebDev

Cuestiones relacionadas