1
votes

Impossible d'itérer les données à l'aide de scrapy en python

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':, ,]>}


1 commentaires

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


3 Réponses :


1
votes

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}


0 commentaires

0
votes

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.

 entrez la description de l'image ici


0 commentaires

0
votes

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}


0 commentaires