2016-07-29 3 views
0

レビューサイトから情報を収集するために構築した作業用スクレーパーがあります。私が抱えている問題は、複数のレビューを含むビジネスページをクロールしてアイテムを生成しようとすると、最初のアイテムをn回だけ取得することです(nはセレクタが見つけたレビューの数です)。スクリーニングオーバーセレクタでは、ページ上にあるセレクタ数に重複した項目が表示されます

私は発電機で多くを読みましたが、私は正しく物事を考えていないので、それは確信しています。 これは簡単なスニペットです。私はコールバックなどを使用してより複雑なクローラを持っていることを理解していますが、このコードは私が話している振る舞いを生成します。

from scrapy import Spider 
from scrapy.selector import Selector 
from yelp.items import ReviewItem 

class CategorySpider(Spider): 
    name = "yelp_search_" 
    allowed_domains = ["yelp.com"] 

    start_urls = ["http://www.yelp.com/biz/j-crew-arden"] 

    def parse(self, response): 
     sel = Selector(response) 

     # There are 9 particular reviews on this page 
     reviews_info = sel.xpath('//div[contains(@class, "review review--with-sidebar") and @itemprop="review"]') 
     for reviewSelector in reviews_info: 
      #If I print the extracted review selector here, I can confirm that only the first review selector is being used 
      #In other words, I expect extract first will extract the one and only result within the revewSelector 
      #Note: if I just do extract(), the item property is populated with a list of all 9 reviewSelectors 
      #i.e. a list of 9 usernames given to me 9 times 
      reviewitem = ReviewItem() 
      reviewitem["username"] = reviewSelector.xpath('//*[@itemprop="author"]/@content').extract_first() 
      reviewitem["userprofileurl"] = reviewSelector.xpath('//*[@class="user-display-name"]/@href').extract_first() 
      reviewitem["userlocation"] = reviewSelector.xpath('//*[contains(@class, "user-location responsive-hidden-small")]/text()').extract_first().strip() 
      reviewitem["reviewtext"] = reviewSelector.xpath('//*[@itemprop="description"]/@content').extract_first() 
      reviewitem["reviewrating"] = reviewSelector.xpath('//*[@itemprop="ratingValue"]/@content').extract_first() 
      reviewitem["reviewdate"] = reviewSelector.xpath('//*[@itemprop="datePublished"]/@content').extract_first() 
      reviewitem["reviewvotesuseful"] = reviewSelector.xpath('//a[@rel="useful"]/span[@class="count"]/text()').extract_first() 
      yield reviewitem 

この特定のコードでは、9個のスクラップ結果が表示されますが、すべてが最初のreviewSelectorです。

私はここで間違っていますか?

答えて

1

「サブセレクタ」reviewSelectorを取得したら、サブセレクタレベルを示すためにxpathの前に.を使用する必要があります。

すなわち、この:

reviewSelector.xpath('//*[@itemprop="author"]/@content').extract_first() 

は次のようになります。それはある

reviewSelector.xpath('.//*[@itemprop="author"]/@content').extract_first() 
+0

!私はそれが簡単だとは信じられません。どうもありがとうございました。 – matisetorm

+1

@matisetormこれはおそらくxpathに関する最も一般的な問題です。 – Granitosaurus

関連する問題