我正在以下网站抓取女演员姓名,职称和得分 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':,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,]>,“名称”:,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,] >,'等级':,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, 、、、、、、、、、、、、、、、、、、、、、、、、、、]>}
答案 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
列表。
答案 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}