2017-10-13 4 views
0

Ich bin auf ein Problem mit einer Spinne gestoßen, die ich zusammengestellt habe. Ich versuche, einzelne Zeilen aus dem Transkript auf this site zu kratzen, und habe einige geeignete Selektoren gefunden, aber wenn er ausgeführt wird, ist die Ausgabe des Spiders einfach die gleiche Zeile, die immer wieder wiederholt wird. Ich habe ein paar andere mit ähnlichen Problemen gesehen (like this), aber habe noch keine Antwort gefunden, die mein Problem löst.Scrapy Spider, die immer wieder die gleichen Elemente zurückgeben

(Als Hinweis, glaube ich, das ein Problem mit meiner Base Python-Codierung und for Schleife Gebäuden sein kann, wie mit scrapy selbst zu einem Problem gegenüber.)

Hier ist die Spinne:

# -*- 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 

Und hier ist ein Screen Grab der CSV-Ausgabe which shows the repeated output.

Das Problem in der for Schleife zu liegen scheint. Mein Gedanke ist dies: Für jeden Selektor in dieser Liste von Selektoren ziehen Sie eine Teilmenge dieses Elements, wie durch die Elemente in der for-Schleife definiert. Stattdessen scheint es ausgeführt zu werden: Für jeden der 177 Selektoren in dieser Liste geben Sie das erste Element jedes definierten Elements zurück.

Ich bin glücklich, irgendwelche dieser Fragen zu klären, und würde jede Hilfe sehr schätzen, die jeder anbieten kann!

+0

Sie müssen nur Ihre Xpath-Ausdrücke innerhalb der Schleife mit einem Punkt beginnen, so dass sie kontextspezifisch sind. – alecxe

Antwort

1

Bitte beachten Sie den absoluten XPath gegenüber relative XPath in der Scrapy.

Beim Parsen durchlaufen Sie die Elemente, die von einem absoluten XPath analysiert wurden. Innerhalb der Schleife verwenden Sie jedoch immer noch absoluten XPath, der falsch ist und relativ XPath sein sollte.

Danke.

+0

Danke dafür, das hat definitiv geholfen! –

Verwandte Themen