2017-10-19 12 views
0

私は一緒にまとめたスパイダーの問題にぶち当たっています。私はthis siteのトランスクリプトから個々のテキスト行とその対応するタイムスタンプを削り取ろうとしていて、適切なセレクタだと思っていますが、実行するとスパイダの出力は最後の行とタイムスタンプに過ぎません。私は似たような問題を抱えているカップルを見たことがありますが、私の問題を解決する答えはまだ見つかりませんでした。ここでセレクタのリストが与えられたときに最後の要素のみを返すScrapy Spider

はクモです:

# -*- coding: utf-8 -*- 

# Define here the models for your scraped items 
# 
# See documentation in: 
# http://doc.scrapy.org/en/latest/topics/items.html 

import scrapy 


class TalTranscriptItem(scrapy.Item): 
    # define the fields for your item here like: 
    # name = scrapy.Field() 
    episode_id = scrapy.Field() 
    episode_num_text = scrapy.Field() 
    year = scrapy.Field() 
    radio_date_text = scrapy.Field() 
    radio_date_datetime = scrapy.Field() 
    episode_title = scrapy.Field() 
    episode_hosts = scrapy.Field() 
    act_id = scrapy.Field() 
    line_id = scrapy.Field() 
    begin_timestamp = scrapy.Field() 
    speaker_class = scrapy.Field() 
    speaker_name = scrapy.Field() 
    line_text = scrapy.Field() 
    full_audio_link = scrapy.Field() 
    transcript_url = scrapy.Field() 

scrapy shellで実行すると、正しく動作しているように見えます(行のすべてを描く:

# -*- coding: utf-8 -*- 
import scrapy 
from this_american_life.items import TalTranscriptItem 

class CrawlSpider(scrapy.Spider): 
    name = "transcript2" 
    allowed_domains = ["https://www.thisamericanlife.org/radio-archives/episode/1/transcript"] 
    start_urls = (
     'https://www.thisamericanlife.org/radio-archives/episode/1/transcript', 
    ) 

    def parse(self, response): 
     item = TalTranscriptItem() 
     for line in response.xpath('//p'): 
      item['begin_timestamp'] = line.xpath('//@begin').extract() 
      item['line_text'] = line.xpath('//text()').extract() 
     yield item 

そして、ここではitems.pyTalTranscriptItem()ためのコードです何らかの理由で私はそれを蜘蛛の中で働かせることができませんでした)。

これらの問題のいずれかを明確にすることができて、誰でも提供できるヘルプがあれば大いに感謝します。

+0

「TalTranscriptItem」はどのようなタイプですか? – Hackerman

+0

@Hackerman質問にTalTranscriptItemのコードを追加します。これは、scrapyプロジェクトディレクトリ内のitems.pyファイルのクラスです。 –

+0

'scrap.Field()'は普通のPython辞書であり、リストではありません。 – Hackerman

答えて

0

私は何であるかの項目を知らないが、あなたは行うことができます。

item = [] 

for line in response.xpath('//p'): 
    dictItem = {'begin_timestamp':line.xpath('//@begin').extract(),'line_text':line.xpath('//text()').extract()} 
    item.append(dictItem) 

print(item) 
+0

ありがとうございます、これはscrapy shellで動作しますが、なんらかの理由で、スパイダーで実行されているときに最後の要素だけを引っ張っています。 –

1

あなたは、個々の行は、私は、これはあなたが欲しいものだと思う項目として得たい場合(yieldラインの最後のインデントに気づきます):

for line in response.css('p'): 
    item = TalTranscriptItem() 
    item['begin_timestamp'] = line.xpath('./@begin').extract_first() 
    item['line_text'] = line.xpath('./text()').extract_first() 
    yield item 
+0

ありがとう!これは理にかなっているようですが、なんらかの理由で、最後の項目を返すだけです。それがなぜ起こっているのでしょうか?もう一度ありがとう –

+0

あなたはどのようにそれをテストしているか教えてください、それは私のシェルで正常に動作します – Wilfredo

関連する問題