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 '}