2012-12-15 8 views
6

私はScrapyまたはPythonを使用するのが比較的新しいです。私はいくつかの異なるリンクから抽出するために探していますが、HTMLXPathSelector式(構文)を使用している問題があります。私は、適切な構文についての広範な文書を見てきましたが、まだ解決策を見つけていません。ここでScrapy - xPathSelectorを使用してネストされた 'img src'を抽出します

私はから「IMG srcを」抽出しようとしていたリンクの例である:私はx.selectための構文を考え出したと思う

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 

私はこの構文/メソッドに慣れていないので、わからない。明確にするために

from scrapy.item import Item, Field 

class GeekItem(Item): 
    imgsrc = Field() 

:ここ

は、基本的には、このためのscrapyチュートリアルに続く、私のitems.pyファイルです私は何を探していますがページ上にあるIMGのsrc URLを抽出しています。私は、すでにわかっているすべてのイメージsrcを抽出する必要はありません(はるかに簡単です)。

私はそれを絞り込み、img srcのその特定のURLのみを抽出したいと考えています。 (私はこのサイト上の複数のページにこれを使用します)

何か助けていただきありがとうございます!

EDIT - 更新されたコード私は(オタク=オタクで、いくつかの構文エラーを得ていた)だから私は、うまくいけば、私はあなたのXPath式がもっとこのようにする必要があります信じて

+0

クリック可能なリンク(つまり、「kindle-fire-hd.jpg」)の画像のみが必要ですか? – Talvalin

+0

はい、正確です。私は画像自体を返そうともしません。画像のURLだけを保存することができます。 – Twhyler

+0

混乱を避けるため、投稿された最初のスパイダーコードを更新し、2番目のスパイダーコードを削除してください。 :) – Talvalin

答えて

3

理解しやすくして機能するように、わずかにそれを変更。私は別のページ(the Amazon shipping center article)でそれをテストし、10個のクリック可能なイメージすべてを返しました。

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

他の問題を解決するには、GeekItemを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

ありがとう!質問をしてから、私はいくつかの構文エラーのためにスパイダーを少し変えました。私は上記の更新されたコードを添付しました。私はもはやエラーを受け取っていませんが、scraped_data.jsonをチェックすると返されるのは[シンボルです。何か案は? – Twhyler

+0

私はitems.pyファイルを添付しました。私は何か問題はないと思っていましたが(私はほぼ完全にチュートリアルのチュートリアルに従っていましたが)、可能な時間と混乱を避けるために、私は「スパイダーはRequest、BaseItemまたはNoneを返さなければならない」というエラーを受け取っていることに気付きました。助けてくれてありがとう! – Twhyler

+0

ご協力いただきありがとうございました。混乱と問題点を解決しました。今私はちょうど私のDBから引っ張って複数のURLを介して動作するようにこれを取得する必要があり、それを私のDBにパイプライン。楽しかったです。再度、感謝します! – Twhyler

関連する問題