2014-07-15 51 views
0

我必須抓取以下url,它基本上包含評論。那裏的所有評論都有評論作者姓名,評論標題和評論本身。使用scrapy抓取同一個名稱的多個獨特項目

我選擇了「python-scrapy」來完成這項任務。

但提到的網址不是起始網址,我將從基本的parse方法中獲取它。在解析中,我將初始化一個itemLoder。我將在那裏提取幾件物品並通過meta傳遞物品。 (提取的字段包含的信息,如酒店名稱,地址,價格等....)

我也宣佈項目,即「review_member_name」,「review_quote」,「review_review」

有超過可以從response.url獲取頁面中的一條評論和評論的評論標識。 (在下面的解析方法中顯示)

因爲有很多評論,所有將共享相同的項目名稱,項目得到連接應該不會發生。任何人都可以建議我解決這個問題嗎?

下面是我的來源parse_review。

def parse_review(self,response): 
    review_nos = re.search(".*www\.tripadvisor\.in/ExpandedUserReviews-.*context=1&reviews=(.+)&servlet=Hotel_Review&expand=1",response.url).group(1) 
    review_nos = review_nos.split(',') # list of review ids 

    for review_no in review_nos: 
     item = response.meta['item'] 
     #item = ItemLoader(item=TripadvisorItem(), response=response) - this works fine but I will lose the items from parse method 
     div_id = "expanded_review_"+review_no 
     review = response.xpath('/html/body/div[@id="%s"]'%div_id) 
     member_name = review.xpath('.//div[@class="member_info"]//div[@class="username mo"]//text()').extract() 
     if member_name: 
      item.add_value('review_member_name', member_name) 

     review_quote = review.xpath('.//div[@class="innerBubble"]/div[@class="quote"]//text()').extract() 
     if review_quote: 
      item.add_value('review_quote', review_quote) 

     review_entry = review.xpath('.//div[@class="innerBubble"]/div[@class="entry"]//text()').extract() 
     if review_entry: 
      item.add_value('review_review', review_entry) 

     yield item.load_item() 

以下是我items.json(「review_review」被刪除,並且從解析方法的項目也被刪除)

[{"review_quote": "\u201c Fabulous service \u201d", "review_member_name": "VimalPrakash"}, {"review_quote": "\u201c Fabulous service \u201d \u201c Indian hospitality at its best, and honestly the best coffee in India \u201d", "review_member_name": "VimalPrakash Jessica P"}, {"review_quote": "\u201c Fabulous service \u201d \u201c Indian hospitality at its best, and honestly the best coffee in India \u201d \u201c Nice hotel in a central location \u201d", "review_member_name": "VimalPrakash Jessica P VikInd"}]

並請提出這個問題,一個好的標題。

回答

0

在做add_value之前,您必須先創建一個新的ItemLoader;現在您正在創建一個項目,並在循環中一次又一次地向其添加新值。

for review_no in review_nos: 
    item = ItemLoader(item=projectItem(), response=response) 

    ... 

    yield item.load_item() 

您還可以使用.add_xpath直接與您供應XPath和創建ItemLoader時使用response.xpath作爲選擇的項目,這樣你可能能夠避免所有,如果測試,讓負載做它應該做什麼:加載項目。

+0

是的,這工作正常。但還有一個問題。我將編輯我的問題 –

+0

請檢查編輯的問題@fiskfisk –

+0

@AshwinRao我不確定你的第二個問題應該是什麼。如果它與原始問題沒有關係,那麼您最好創建單獨的問題。 – MatsLindh

相關問題