簡體   English   中英

給定選擇器列表時,Scrapy Spider僅返回最后一個元素

[英]Scrapy Spider returning only last element when given a list of Selectors

我遇到了一個我放在一起的蜘蛛的問題。 我正在嘗試從此站點上的腳本中抓取文本的各個行及其相應的時間戳,並發現了我認為合適的選擇器,但是運行時,sp​​ider的輸出只是最后一行和時間戳。 我見過其他一些有類似問題的人,但還沒有找到解決我問題的答案。

這是蜘蛛:

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

這里是代碼TalTranscriptItem()items.py

# -*- 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運行時,它似乎可以正常工作(繪制所有文本行),但是由於某種原因,我無法使其在Spider中工作。

我很高興澄清所有這些問題,非常感謝任何人都可以提供的任何幫助!

如果您希望將每個行都作為項目產生,那么我想這就是您想要的(請注意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

我不知道什么是物品,但您可以這樣做:

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM