2017-10-13 16 views
0

J'ai eu un problème avec une araignée que j'ai mis ensemble. J'essaie de gratter des lignes individuelles de la transcription sur this site, et j'ai trouvé quelques sélecteurs appropriés, mais lorsqu'il est exécuté, la sortie de l'araignée est simplement la même ligne répétée encore et encore. J'ai vu un couple d'autres avec des problèmes similaires (like this), mais n'ont pas encore trouvé une réponse qui résout mon problème.Scrapy Spider retournant les mêmes éléments encore et encore

(Comme une note, je crois que cela peut être un problème avec mon codage Python de base et for bâtiment en boucle, par opposition à un problème avec scrapy lui-même.)

Voici l'araignée:

# -*- coding: utf-8 -*- 
import scrapy 
from scrapy.linkextractors import LinkExtractor 
from scrapy.spiders import CrawlSpider, Rule 


class TalSpider(CrawlSpider): 
    name = 'tal' 
    allowed_domains = ['https://www.thisamericanlife.org/radio-archives/episode/'] 
    start_urls = ['https://www.thisamericanlife.org/radio-archives/episode/1/transcript/'] 

def parse(self, response): 

    for line in response.xpath('//div'): 
     episode_num_text = line.xpath('//div[contains(@class, "radio-wrapper")]/@id').extract() 
     radio_date_text = line.xpath('//div[contains(@class, "radio-date")]/text()').extract() 
     episode_title = line.xpath('//h2').xpath('a[contains(@href, *)]/text()').extract() 
     begin_timestamp = line.xpath('//p[contains(@begin, *)]/@begin').extract() 
     speaker_class = line.xpath('//div/@class').extract() 
     speaker_name = line.xpath('//h4/text()').extract() 
     line_text = line.xpath('//p[contains(@begin, *)]/text()').extract() 
     full_audio_link = line.xpath('//p[contains(@class, "full-audio")]/text()').extract() 



     for item in zip(episode_num_text, radio_date_text, episode_title, begin_timestamp, speaker_class, speaker_name, line_text, full_audio_link): 
      scraped_info = { 
       'episode_num_text' : item[0], 
       'radio_date_text' : item[1], 
       'episode_title' : item[2], 
       'begin_timestamp' : item[3], 
       'speaker_class' : item[4], 
       'speaker_name' : item[5], 
       'line_text' : item[6], 
       'full_audio_link' : item[7], 
       } 
      yield scraped_info 

Et voici une capture d'écran de la sortie .csv which shows the repeated output.

la question semble se situer dans la boucle for. Ma pensée est la suivante: pour chaque sélecteur de cette liste de sélecteurs, tirez un sous-ensemble de cet élément tel que défini par les éléments de la boucle for. Au lieu de cela, il semble être en cours d'exécution: pour chacun des 177 sélecteurs de cette liste, renvoyez le premier élément de chacun des éléments définis.

Je suis heureux de clarifier l'un de ces problèmes, et j'apprécierais grandement toute aide que n'importe qui peut offrir!

+0

Vous avez juste besoin de démarrer vos expressions xpath à l'intérieur de la boucle avec un point qui les rend spécifiques au contexte. – alecxe

Répondre

1

Veuillez prendre en compte le XPath absolu par rapport à relative XPath dans Scrapy.

Lors de l'analyse, vous parcourez les éléments analysés à partir d'un XPath absolu. Cependant, à l'intérieur de la boucle, vous utilisez toujours XPath absolu, ce qui est faux et devrait être relatif XPath.

Merci.

+0

Merci pour cela, cela a certainement aidé! –