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