2012-12-15 14 views
6

Ich bin relativ neu in der Verwendung von Scrapy oder Python. Ich suche, um das von einigen verschiedenen Verbindungen zu extrahieren, und ich habe Probleme, einen HTMLXPathSelector Ausdruck (Syntax) zu verwenden. Ich habe ausführliche Dokumentation für die richtige Syntax angeschaut, aber habe noch keine Lösung gefunden. HierScrapy - extrahieren verschachtelten 'img src' mit xPathSelector

ist ein Beispiel für eine Verbindung Ich versuche, das ‚img src‘ zu extrahieren aus:

Page I am trying to extract the img src url from

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

class GeekSpider(BaseSpider): 
    name = "geekS" 
    allowed_domains = ["geek.com"] 
    start_urls = ["http://www.geek.com/articles/gadgets/kindle-fire-hd-8-9-on-sale-for-50-off-today-only-20121210/"] 

    def parse(self, response): 
     hxs = HtmlXPathSelector(response) 
     imgurl = hxs.select("//div[@class='article']//a/img/@src").extract() 
     return imgurl 

Ich glaube, ich habe die Syntax für die x.select heraus Aussage, aber, da ich neu zu dieser Syntax/Methode bin ich mir nicht sicher.

Hier meine items.py Datei, gefolgt grundsätzlich die scrapy Tutorial dafür:

from scrapy.item import Item, Field 

class GeekItem(Item): 
    imgsrc = Field() 

Zur Klarstellung: Was ich suche die img src URL zu tun ist, zu extrahieren, die auf der Seite ist. Ich muss nicht alle Bildquellen extrahieren, die ich bereits herausgefunden habe (viel einfacher).

Ich suche nur um es zu verengen und extrahieren nur, dass bestimmte URL des img src. (Ich werde dies über mehrere Seiten auf dieser Website verwenden)

Jede Hilfe wird sehr geschätzt!

EDIT - Aktualisiert-Code Ich war immer einige Syntaxfehler mit Geek = Aussenseiter() So habe ich es etwas zu hoffentlich leichter zu verstehen und Funktion

+0

Sie wollen nur das Bild, das eine anklickbare Verbindung ist (zB "kindle-fire-hd.jpg")? – Talvalin

+0

Ja, genau. Ich möchte nicht einmal das Bild selbst zurückgeben, nur die URL für das Bild, damit ich es speichern kann. – Twhyler

+0

Um Verwechslungen zu vermeiden, aktualisieren Sie bitte den ersten veröffentlichten Spider-Code und löschen Sie den zweiten. :) – Talvalin

Antwort

3

ich Ihren XPath-Ausdruck glauben sollte so mehr sein . Ich testete es auf einer anderen Seite (the Amazon shipping center article) und es gab alle zehn der anklickbaren Bilder zurück.

Um Ihr anderes Problem zu beheben, müssen Sie GeekItem in Ihren GeekSpider-Code importieren.

from scrapy.spider import BaseSpider 
from scrapy.selector import HtmlXPathSelector 
from geekspider.items import GeekItem # I'm guessing the name of your project here 

class GeekSpider(BaseSpider): 
    name = "geekS" 
    allowed_domains = ["geek.com"] 
    start_urls = ["http://www.geek.com/articles/gadgets/kindle-fire-hd-8-9-on-sale-for-50-off-today-only-20121210/"] 

    def parse(self, response): 
     item = GeekItem() 
     hxs = HtmlXPathSelector(response) 
     item['imgsrc'] = hxs.select("//div[@class='article']//a/img/@src").extract() 
     return item 
+0

Danke! Seit ich die Frage gestellt habe, habe ich die Spinne wegen einiger Syntaxfehler leicht verändert. Ich habe den aktualisierten Code oben angefügt. Ich erhalte die Fehler nicht mehr, aber beim Überprüfen von scraped_data.json wird nur ein [Symbol angezeigt. Irgendwelche Ideen? – Twhyler

+0

Ich habe auch meine items.py Datei angehängt, ich dachte nicht, dass irgendetwas damit nicht stimmt (da ich das Scrapy Tutorial fast genau befolgt habe), aber um Zeit und Verwirrung zu sparen, habe ich es oben angehängt. Ich habe bemerkt, dass ich einen Fehler erhalte, der besagt, dass Spider Request, BaseItem oder None zurückgeben muss. Danke für die Hilfe! – Twhyler

+0

Vielen Dank für Ihre Hilfe, die Verwirrung und die Probleme, die ich hatte. Jetzt muss ich nur noch über mehrere URLs hinweg arbeiten, die aus meiner Datenbank gezogen wurden, und sie zurück in meine Datenbank leiten. Sollte lustig sein. Danke noch einmal! – Twhyler