Scrapy蜘蛛一遍又一遍地回归相同的元素

时间:2017-10-13 20:27:10

标签: python xpath scrapy scrapy-spider

我遇到了一个我把它放在一起的蜘蛛问题。我试图从this site上的抄本中搜索单独的行,并找到了一些合适的选择器,但是在运行时,蜘蛛的输出只是反复重复的同一行。我见过其他几个有类似问题的人(like this),但还没有找到解决我问题的答案。

(请注意,我认为这可能是我的基础Python编码和for循环构建的问题,而不是scrapy本身的问题。)

这是蜘蛛:

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

这是.csv输出的屏幕抓取 which shows the repeated output.

问题似乎在于for循环。我的想法是:对于这个选择器列表中的每个选择器,拉出由for循环中的项定义的元素子集。相反,它似乎正在执行:对于此列表中的每个177选择器,返回定义的每个项的第一个元素。

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

1 个答案:

答案 0 :(得分:1)

请注意Scrapy中的绝对XPath与relative XPath

解析时,循环遍历从绝对XPath解析的元素。但是,在循环内部,您仍然使用绝对XPath,这是错误的,应该是相对XPath。

感谢。

相关问题