无法在python中使用scrapy来迭代数据

时间:2019-06-30 07:34:39

标签: python scrapy screen-scraping

我正在以下网站抓取女演员姓名,职称和得分 http://www.timescelebex.com/top_actresses

我可以获取1条记录,但无法进行迭代以查找其余记录

我只能接收1条记录,如下所示:

{'得分':u'41.0','名称':u'Deepika Padukone','等级':u'1'}

我想为所有记录提取以上内容

# -*- coding: utf-8 -*-
import scrapy


class ActressListSpider(scrapy.Spider):
    name = 'actress_list'
    allowed_domains = ['timescelebex.com/top_actresses']
    start_urls = ['http://timescelebex.com/top_actresses/']

    def parse(self, response):
        names=response.xpath('/html/body/div[2]/section/div/div/div[1]/table/tbody/tr/td/table/tbody/tr/td[1]/table/tbody')

        for name in names:
            actress = name.xpath('//*[@class="Droid Ctxt1"]/text()').extract_first()
            rank = name.xpath('//*[@class="Droid Stext"]/text()').extract_first()
            score = name.xpath('//*[@class="Stext2"]/text()').extract_first()

            yield{'Name':actress,'Rank':rank,'Score':score}

如果我使用.extract而不是.extract_first(),我可以看到所有数据,但其数据如下所示

{'Score':,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,]>,“名称”:,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,] >,'等级':,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, 、、、、、、、、、、、、、、、、、、、、、、、、、、]>}

3 个答案:

答案 0 :(得分:1)

您需要在for循环内使用相对 XPath:

def parse(self, response):
    names=response.xpath('//table[@class="ITable"]//table//tr[position() > 2]')

    for name in names:
        actress = name.xpath('.//*[@class="Droid Ctxt1"]/text()').extract_first()
        rank = name.xpath('.//*[@class="Droid Stext"]/text()').extract_first()
        score = name.xpath('.//*[@class="Stext2"]/text()').extract_first()

        yield{'Name':actress,'Rank':rank,'Score':score}

答案 1 :(得分:0)

使用此XPath获取所有所需的选择器:

names = response.xpath('//td[@width="35%"]//tr[td[contains(@class, "Droid")]]')

这将从第一张表(2018年1月)中选择所有包含女演员的行(跳过表头)。然后,您可以遍历选择器的names列表。

enter image description here

答案 2 :(得分:0)

Css版本

def parse(self, response):
        names=response.css('tr')

        for name in names:
            actress = name.css('td.Droid.Ctxt1::text').extract_first()
            rank = name.xpath('td.Droid.Stext::text').extract_first()
            score = name.xpath('td.Stext2::text').extract_first()

            yield{'Name':actress,'Rank':rank,'Score':score}