2016-05-22 3 views
0

Ich versuche Top 100 t20 Batsmen von ICC-Seite zu verschrotten, aber die CSV-Datei, die ich bekomme, ist leer. Es gibt keine Fehler in meinem Code (zumindest kenne ich sie nicht). Hier ist meine Artikel DateiMein Scrapy kratzt nichts (leere csv-Datei)

import scrapy 

class DmozItem(scrapy.Item): 
    Ranking = scrapy.Field() 
    Rating = scrapy.Field() 
    Name = scrapy.Field() 
    Nationality = scrapy.Field() 
    Carer_Best_Rating = scrapy.Field() 

dmoz_spider Datei

import scrapy 

from tutorial.items import DmozItem 

class DmozSpider(scrapy.Spider): 
    name = "espn" 
    allowed_domains = ["relianceiccrankings.com"] 
    start_urls = ["http://www.relianceiccrankings.com/ranking/t20/batting/"] 

    def parse(self, response): 
     #sel = response.selector 
     #for tr in sel.css("table.top100table>tbody>tr"): 
     for tr in response.xpath('//table[@class="top100table"]/tr'): 
      item = DmozItem() 
      item['Ranking'] = tr.xpath('//td[@class="top100id"]/text()').extract_first() 
      item['Rating'] = tr.xpath('//td[@class="top100rating"]/text()').extract_first() 
      item['Name'] = tr.xpath('td[@class="top100name"]/a/text()').extract_first() 
      item['Nationality'] = tr.xpath('//td[@class="top100nation"]/text()').extract_first() 
      item['Carer_Best_Rating'] = tr.xpath('//td[@class="top100cbr"]/text()').extract_first() 
      yield item 

was mit meinem Code falsch?

+0

Ich weiß nicht viel über Scrapy, aber wo fordern Sie die HTML oder schreiben Sie an eine CSV? –

+0

@ cricket_007 in sel.css Ich übergebe den Klassennamen der Tabelle, es ist eine for-Schleife, um alle Zeilen zu holen und jede Klasse in Items ist der Klassenname, der in html in Bezug auf die Item-Liste erwähnt wird zB 'Ranking' title hat class = top100id. Ich hoffe, das war das, was du gefragt hast? – hyeri

+0

habe gerade Ihren bearbeiteten Beitrag gesehen. Ich schrieb in die CSV-Datei mit dem Befehl "scrapy crawl espn -o items.csv" – hyeri

Antwort

2

Die Website, die Sie zu verschrotten versuchen, hat einen Rahmen, den Sie verwerfen möchten.

start_urls = [ 
    "http://www.relianceiccrankings.com/ranking/t20/batting/" 
] 

Dies ist die korrekte URL

auch viel mehr Sachen falsch los ist,

  • Elemente auswählen sollten Sie die response selbst verwenden, brauchen Sie nicht zu initiiere eine Variable mit response.selector wähle einfach direkt aus response.xpath(//foo/bar)

  • Dein CSS-Selektor für die Tabelle ist falsch. top100table ist eher eine Klasse als eine ID, daher sollte .top100table und nicht #top100table sein.

Hier haben nur die XPath für sie:

response.xpath("//table[@class='top100table']/tr") 

tbody ist nicht Teil des HTML-Code, es erscheint nur, wenn Sie mit einem modernen Browser überprüfen.

  • Die extract() Methode immer gibt eine Liste eher dann das Element selbst, so dass Sie das erste Element extrahieren müssen Sie wie diese finden:

item['Ranking'] = tr.xpath('td[@class="top100id"]/a/text()').extract_first()

hoffe, das hilft, die Spaß haben kratzen!

+0

Vielen Dank für die Korrektur :) Die CSV-Datei erzeugt, aber das Problem ist, dass es nur das erste Element wie für Spalte "Ranking" extrahiert es erzeugt nur 1 für alle Batsmen das gleiche ist der Fall ist mit "Rating" und "Career Best Rating", btw Ich habe den Code oben aktualisiert :) Batsmen Namen drucken gut – hyeri

+0

@hyeri hast du es geschafft, das Problem mit "Ranking zu beheben "? – Steve

0

Um Ihr Ranking-Problem zu beantworten, beginnt der xpath für Ranking mit '// ...', was 'vom Anfang der Seite' bedeutet. Sie müssen es relativ zu tr stattdessen sein. Entfernen Sie einfach das '//' von jedem xpath in der for-Schleife.