2012-12-15 20 views
6

Jestem stosunkowo nowy w używaniu Scrapy lub Pythona. Szukam wyodrębnić z kilku różnych linków i mam problemy przy użyciu wyrażenia HTMLXPathSelector (składni). Rozważałem obszerną dokumentację dla poprawnej składni, ale jeszcze nie znalazłem rozwiązania.Scrapy - ekstrakt zagnieżdżony "img src" przy użyciu xPathSelector

Oto przykład łącza Próbuję wyodrębnić img src „” z:

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 

Myślę, że zorientowali się, składni dla x.select oświadczenie, ale ponieważ jestem nowy w tej składni/metody, nie jestem pewien.

Oto moja items.py plik, a następnie w zasadzie tutorial scrapy dla tego:

from scrapy.item import Item, Field 

class GeekItem(Item): 
    imgsrc = Field() 

do wyjaśnienia: Co szukam zrobić to wyodrębnić img src URL, który znajduje się na stronie. Nie muszę wyodrębniać wszystkich obrazów src, które już wymyśliłem (o wiele łatwiej).

Po prostu szukam tego, aby zawęzić i wyodrębnić ten konkretny URL pliku img src. (użyję tego na wielu stronach w tej witrynie)

Każda pomoc jest bardzo doceniana!

EDIT - Aktualizacja Code ja dostawałem jakieś błędy składniowe z maniakiem = maniakiem(), więc zmienił go lekko do nadzieją być łatwiejsze do zrozumienia i funkcja

+0

A więc chcesz tylko obraz, który jest klikalnym linkiem (np. "Kindle-fire-hd.jpg")? – Talvalin

+0

Tak, dokładnie. Nie chcę nawet zwracać samego obrazu, tylko adres URL obrazu, żeby go zapisać. – Twhyler

+0

Aby uniknąć nieporozumień, zaktualizuj pierwszy opublikowany kod pająka i usuń drugi. :) – Talvalin

Odpowiedz

3

wierzę Twój wyrażenie XPath powinno być więcej tak . Przetestowałem to na innej stronie (the Amazon shipping center article) i zwrócono wszystkie dziesięć klikalnych obrazów.

geek['imgsrc'] = x.select("//div[@class='article']//a/img/@src").extract() 

Aby naprawić swój drugi problem, musisz zaimportować GeekItem do swojego kodu GeekSpider.

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

Dzięki! Od zadania pytania zmieniłem lekko pająk ze względu na błędy składniowe. Załączam zaktualizowany kod powyżej. Nie otrzymuję już błędów, ale podczas sprawdzania skradzionych_danych.json wszystko, co jest zwracane, to [symbol. Jakieś pomysły? – Twhyler

+0

Załączam również plik items.py, nie myślałem, że coś jest z nim nie tak (jak postępowałem dokładnie po tutorialu do scrapy), ale tylko po to, aby zaoszczędzić czas i zamieszanie, załączyłem go wyżej. Zauważyłem, że otrzymuję komunikat o błędzie "pająk musi zwrócić żądanie, element BaseItem lub Brak". Dzięki za pomoc! – Twhyler

+0

Dzięki za pomoc, wyjaśniłem zamieszanie i problemy, które miałem. Teraz potrzebuję, aby to działało przez wiele adresów URL pobranych z mojej bazy danych i przetransferować ją z powrotem do bazy danych. Powinno być zabawnie. Dzięki jeszcze raz! – Twhyler

Powiązane problemy