0

基本的にレビューが含まれている次のURLをクロールする必要があります。そこにあるすべてのレビューには、レビュー ライターの名前、レビューのタイトル、およびレビュー自体があります。

このタスクを実行するために「python-scrapy」を選択しました。

しかし、言及されたURLは開始URLではなく、基本的なparse方法から取得します。解析すると、a を初期化しitemLoderます。metaそこでいくつかのアイテムを抽出し、レスポンス経由でアイテムを渡します。(抽出されたフィールドには、ホテル名、住所、価格などの情報が含まれています...)

「review_member_name」、「review_quote」、「review_review」というアイテムも宣言しました

ページには複数のレビューがあり、レビューのレビュー ID は から取得できますresponse.url。(以下の parse メソッドに示されています)

多くのレビューがあり、すべてが同じアイテム名を共有するため、アイテムが連結されますが、これは起こるべきではありません。誰でもこれを解決する方法を提案できますか?

以下は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」は削除されており、parseメソッドからのアイテムも削除されています)

[{"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"}]

そして、この質問にふさわしいタイトルを提案してください。

4

1 に答える 1

0

ItemLoaderそれを行う前に、新しいものを作成する必要がありますadd_value。1 つの項目を作成し、新しい値をループ内で何度も追加しています。

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

    ...

    yield item.load_item()

.add_xpath提供している xpath で直接使用することもできます。またresponse.xpath、 を作成するときに項目のセレクターとして使用することもできます。ItemLoaderそうすれば、おそらくすべての if テストを回避し、ロードに本来行うべきことを実行させることができます: 項目のロード。

于 2014-07-15T11:36:49.537 に答える