Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 当给定选择器列表时,Scrapy Spider只返回最后一个元素_Python_Xpath_Scrapy_Scrapy Spider - Fatal编程技术网

Python 当给定选择器列表时,Scrapy Spider只返回最后一个元素

Python 当给定选择器列表时,Scrapy Spider只返回最后一个元素,python,xpath,scrapy,scrapy-spider,Python,Xpath,Scrapy,Scrapy Spider,我遇到了一个蜘蛛的问题,我把它放在一起。我试图从转录本上刮取单独的文本行及其相应的时间戳,并找到了我认为合适的选择器,但运行时,爬行器的输出只是最后一行和时间戳。我见过另外两个有类似问题的人,但还没有找到解决我问题的答案 这是蜘蛛: # -*- coding: utf-8 -*- import scrapy from this_american_life.items import TalTranscriptItem class CrawlSpider(scrapy.Spider): n

我遇到了一个蜘蛛的问题,我把它放在一起。我试图从转录本上刮取单独的文本行及其相应的时间戳,并找到了我认为合适的选择器,但运行时,爬行器的输出只是最后一行和时间戳。我见过另外两个有类似问题的人,但还没有找到解决我问题的答案

这是蜘蛛:

# -*- 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.py
TalTranscriptItem()
的代码:

# -*- 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中工作


我很高兴澄清这些问题,并将非常感谢任何人能够提供的任何帮助

我不知道是什么项目,但您可以:

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)

如果您希望将每一行作为一个项目生成,我想这就是您想要的(请注意
生成
行的最后一个缩进):


什么类型是
TalTranscriptItem
?@Hackerman我将在问题中添加TalTranscriptItem的代码。它是scrapy项目目录中items.py文件中的一个类。如果我没记错的话,
scrapy.Field()
是一个普通的旧python字典,而不是list@Hackerman我想你是对的-你是指
for
循环中的
.append
方法吗?是的,这就是为什么它只存储一个项目的原因。谢谢,这在粘壳中工作,但由于某些原因,它在蜘蛛中运行时仍然只拉动最后一个元素。谢谢!这似乎是有道理的,但出于某种原因,它仍然只返回最后一个项目,即使是在刮壳。知道为什么吗?再次谢谢你能告诉我你是如何测试它的吗?它在我的外壳里工作得很好
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