2017-06-23 2 views
0

Je construis cette araignée en scrapy, python 3.0. Le problème est que chaque fois que j'utilise des règles, cela donne une erreur "syntaxe invalide" pour def parse_productPage. Lorsque je supprime les règles, il ne se plaint pas et fonctionne bien. Je ne peux pas trouver ce qui ne va pas avec le code. Pouvez-vous m'aider s'il vous plaît. Voici le codeQuand j'utilise des règles dans Scrapy Spider Il donne une erreur de syntaxe invalide pour la fonction suivante

import scrapy 
from quo.items import QuoItem 
from scrapy.linkextractors import LinkExtractor 
from scrapy.spiders import CrawlSpider, Rule 

class ISpider(CrawlSpider): 
    name='iShopE' 
    allowed_domains = ['ishopping.pk'] 
    start_urls = ['https://www.ishopping.pk/electronics/home-theatres.html'] 
    rules = (
       Rule(LinkExtractor(restrict_xpaths=('//div["category-products-"]'), follow=True), 
       Rule(LinkExtractor(restrict_xpaths=('//h2[@class="product-name"]/a/@href'), callback='parse_productPage'), 
    ) 


    def parse_productPage(self,response): 
     for rev in response.xpath('//div["product-essential"]'): 
     item=QuoItem() 
     price=response.xpath('//div[@class="price-box"]/span[@class="regular-price"]/meta[@itemprop="price"]/@content').extract() 
     if price: 
      item['price']=price 
     Availability=response.xpath('//p[@class="availability in-stock"]/span[@class="value"]/text()').extract() 
     if Availability: 
      item['Availability']=Availability 
     Brand=response.xpath('(//div[@class="box-p-attr"]/span)[1]/text()').extract() 
     if Brand: 
      item['Brand']=Brand 
     deliveryTime=response.xpath('(//div[@class="box-p-attr"]/span)[2]/text()').extract() 
     if deliveryTime: 
      item['deliveryTime']=deliveryTime 
     Waranty=response.xpath('(//div[@class="box-p-attr"]/span)[3]/text()').extract() 
     if Waranty: 
      item['Waranty']=Waranty 

     yield item 

Voici le journal de sortie Output log

Répondre

0

Contrairement à ce que le message d'erreur indique, le problème est en fait dans les lignes avant:

rules = (
    Rule(LinkExtractor(restrict_xpaths=('//div["category-products-"]'), follow=True), 
    Rule(LinkExtractor(restrict_xpaths=('//h2[@class="product-name"]/a/@href'), callback='parse_productPage'), 
) 

Si vous comptez soigneusement les parenthèses Ici, vous pouvez voir qu'il y a trois parenthèses ouvrantes mais seulement deux fermetures pour chaque règle:

Rule(
    LinkExtractor(
     restrict_xpaths=('//div["category-products-"]'), 
     follow=True 
    ) 

Donc, pour résoudre ce problème, ajoutez simplement une parenthèse fermante pour chaque Rule:

rules = (
    Rule(LinkExtractor(restrict_xpaths=('//div["category-products-"]'), follow=True)), 
    Rule(LinkExtractor(restrict_xpaths=('//h2[@class="product-name"]/a/@href'), callback='parse_productPage')), 
)