Je cherche ci-dessous le site Web pour le nom, le rang et le score de l'actrice http://www.timescelebex.com/top_actresses
J'ai pu obtenir 1 enregistrement, mais impossible d'itérer avec pour chercher le reste des enregistrements
Je pourrais recevoir des données comme ci-dessous mais pour un seul enregistrement
{'Score': u'41.0 ',' Name ' : u'Deepika Padukone ',' Rank ': u'1'}
je veux extraire comme ci-dessus pour tous les enregistrements
# -*- 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}
si j'utilise .extract au lieu de .extract_first () je pourrais voir toutes les données mais elles arrivent comme ci-dessous
{'Score':, ,]> , 'Nom': , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,]>, 'Rang':, ,]>}
3 Réponses :
Vous devez utiliser relatif XPath dans pour boucle:
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}
Utilisez ce XPath pour obtenir tous les sélecteurs voulus:
names = response.xpath('//td[@width="35%"]//tr[td[contains(@class, "Droid")]]')
Cela sélectionnera toutes les lignes avec des actrices (en ignorant l'en-tête du tableau) de la première table (janvier 2018). Ensuite, vous pouvez parcourir la liste des noms des sélecteurs.
Version Css
def parse(self, response):
names=response.css('tr')
for name in names:
actress = name.css('td.Droid.Ctxt1::text').extract_first()
rank = name.css('td.Droid.Stext::text').extract_first()
score = name.css('td.Stext2::text').extract_first()
yield{'Name':actress,'Rank':rank,'Score':score}
tous les scores sur 1 ligne, tous les noms sur 1 ligne et tous les rangs sur 1 ligne ... avec l'utilisation de la méthode extract (). je veux un score, une actrice, un classement pour chaque enregistrement comme celui-ci .... {'Score': u'41.0 ',' Name ': u'Deepika Padukone', 'Rank': u'1 '}