2012-03-27 14 views
0

Ich habe durch das Tutorial gearbeitet, das es an ein Projekt anpasst, das ich erreichen möchte. Mir scheint etwas schief gegangen zu sein, dass ich den Fehler einfach nicht finden kann.Ratschläge, die // td Text und Zahlen extrahieren

Bei der Verwendung von 'Scrapy Shell' kann ich die Antwort erhalten, die ich erwarte. So für diese Seite Nrl Ladder

In [1]: hxs.select('//td').extract() 
Out[1]: 
[u'<td>\r\n<div id="ls-nav">\r\n<ul><li><a href="http://www.nrlstats.com/"><span>Home</span></a></li>\r\n<li class="ls-nav-on"><a href="/nrl"><span>NRL</span></a></li>\r\n<li><a href="/nyc"><span>NYC</span></a></li>\r\n<li><a href="/rep"><span>Rep Matches</span></a></li>\r\n\r\n</ul></div>\r\n</td>', 
u'<td style="text-align:left" colspan="5">Round 4</td>', 
u'<td colspan="5">Updated: 26/3/2012</td>', 
u'<td style="text-align:left">1. Melbourne</td>', 
u'<td>4</td>', 
u'<td>4</td>', 
u'<td>0</td>', 
u'<td>0</td>', 
u'<td>0</td>', 
u'<td>122</td>', 
u'<td>39</td>', 
u'<td>83</td>', 
u'<td>8</td>', 
u'<td style="text-align:left">2. Canterbury-Bankstown</td>', 

Und weiter geht es.

Ich habe wirklich Mühe zu verstehen, wie man das Tutorial-Projekt ändert, um es in einen anderen Datentyp zu ändern.

Gibt es trotzdem eine Hilfe oder eine Dokumentationsliste, um zu sehen, welche Typen ich verwenden sollte, wenn ich 'td' oder irgendeinen anderen Gegenstand benutze. Wie ich sage, es funktioniert einfach in der Shell, aber ich kann es nicht in die Dateien umwandeln. Insbesondere sind sowohl die Teamnamen als auch die Punkte 'td', aber der Teamname ist Text.

hier ist was ich getan habe.

from scrapy.spider import BaseSpider 
from scrapy.selector import HtmlXPathSelector 

from nrl.items import NrlItem 

class nrl(BaseSpider): 
    name = "nrl" 
    allowed_domains = ["http://live.nrlstats.com/"] 
    start_urls = [ 
     "http://live.nrlstats.com/nrl/ladder.html", 
     ] 

    def parse(self, response): 
     hxs = HtmlXPathSelector(response) 
     sites = hxs.select('//td') 
     items = [] 
     for site in sites: 
      item = nrlItem() 
      item['team'] = site.select('/text()').extract() 
      item['points'] = site.select('/').extract() 
      items.append(item) 
     return items 
+0

Haben Sie BeautifulSoup versucht? Es ist ein bisschen mehr manuell, aber Sie könnten in der Lage sein, ein bisschen mehr Kontrolle auf diese Weise –

+0

Nein noch nicht, aber vielleicht, wenn das nicht funktioniert, werde ich. – sayth

+0

@PreetKukreti es stellt sich heraus, dass Scrapy BeautifulSoup sowie http://doc.scrapy.org/en/latest/topics/spiders.html – sayth

Antwort

2

ich nicht ganz verstehe Ihre Frage, aber hier ist ein Ausgangspunkt, imo (nicht getestet, einige Kommentare in den Code sehen):

from scrapy.spider import BaseSpider 
from scrapy.selector import HtmlXPathSelector 

from nrl.items import NrlItem 

class nrl(BaseSpider): 
    name = "nrl" 
    allowed_domains = ["live.nrlstats.com"] # domains should be like this 
    start_urls = [ 
     "http://live.nrlstats.com/nrl/ladder.html", 
     ] 

    def parse(self, response): 
     hxs = HtmlXPathSelector(response) 
     rows = hxs.select('//table[@class="tabler"]//tr[starts-with(@class, "r")]') # select team rows 
     items = [] 
     for row in rows: 
      item = nrlItem() 
      columns = row.select('./td/text()').extract() # select columns for the selected row 
      item['team'] = columns[0] 
      item['P'] = int(columns[1]) 
      item['W'] = int(columns[2]) 
      ... 
      items.append(item) 
     return items 

UPDATE:

//table[@class="tabler"//tr[starts-with(@class, "r")] ist eine Xpath-Abfrage. Sehen Sie einige xpath examples here.

hxs.select(xpath_query) gibt immer eine Liste von Knoten (auch vom Typ HtmlXPathSelector) zurück, die unter die angegebene Abfrage fallen.

hxs.extract() gibt String-Darstellung des Knotens (der Knoten) zurück.

P.S. Beachten Sie, dass scrapy XPath 1.0 unterstützt, aber nicht 2.0 (zumindest unter Linux, nicht sicher über Windows), sodass einige der neuesten xpath-Funktionen möglicherweise nicht funktionieren. auch

Siehe:

+0

verwenden kann, wie finde ich zusätzliche Informationen über Zeug wie diese Zeile rows = hxs.select ('// table [@ class = "tabler" // tr [startet-mit (@class, "r")]') aus dem Tutorial ist es nicht offensichtlich das ist, was ich tun würde. – sayth

+1

Dies ist eine xpath-Frage, die nicht mit scrapy zusammenhängt. Ich denke nicht, dass Scrapy Docs das haben. Siehe mein Update. Ich habe auch [tag: xpath] -Tag zu Ihrer Frage hinzugefügt. – warvariuc

+0

Ich erhalte diesen Fehler mit dem Xpath-Selektor raise ValueError ("Ungültiger XPath:% s"% xpath) \t exceptions.ValueError: Ungültig XPath: // Tabelle [@ class = "tabler" // tr [startet mit (@ Klasse, "r")] – sayth