2016-04-27 7 views
-1

以下のスクリプトを使用して、imdbからムービーのレビューと評価を抽出しています。scrapyから返されたリストをPythonのデータフレームに変換する方法

from scrapy.spiders import Spider 
from scrapy.selector import Selector 
from imdb.items import ImdbItem 


class ImdbSpider(Spider): 
    name = "imdb" 
    allowed_domains = ["imdb.com"] 
    start_urls = [ 
     "http://www.imdb.com/title/tt0068646/reviews?ref_=%20best", 

    ] 

    def parse(self, response): 
     sel = Selector(response) 
     sites = sel.xpath('//div[contains(@id,"tn15content")]/p') 
     ratings = sel.xpath('//div[contains(@id,"tn15content")]/div/img') 
    items = [] 

     for site in sites: 
      item = ImdbItem() 
      item['review'] = site.xpath('text()').extract_first() 
      items.append(item) 

    for rating in ratings: 
      item = ImdbItem() 
      item['rating'] = rating.xpath('@alt').extract_first() 
      items.append(item) 

    return items 

しかし、これは私がパンダDATAFRAME object.Is内のすべてのデータを入れて探しています.But初めにレビューして、評価を(それがリストであるとして、それがあるべきように)持っているリストを返します。そこには私が蜘蛛の蜘蛛の中からそれをやり遂げることができる方法はありますか?誰かが親切にこれについて私を助けることができますか?

私が望む結果はイメージの最初の部分にあり、私が得るのはイメージの2番目の部分です。注:これは私が表示している1つのレビューのためです。

image of outputs:

+0

私たちが望む情報で作成されたDataFrameオブジェクトの例とその例はありますか? – eLRuLL

+0

私はもう一度 - 返されたデータのサンプルと 'pd.DataFrame'がどのように見えるかの例を参考にします。 – nlsdfnbch

+0

その後、そのデータフレームで何をしたいですか? – bergonzzi

答えて

0

リストの代わりに辞書への書き込みを編集し、あなたのコード:その後、

items = {'Ratings':[], 'Reviews':[]} 

for site, rating in zip(sites, ratings): 
    review = ImdbItem() 
    rating = ImdbItem() 

    review['review'] = site.xpath('text()').extract_first()  
    rating['rating'] = rating.xpath('@alt').extract_first() 
    print(review['review'], rating['rating']) 

    items['Ratings'].append(rating) 
    items['Reviews'].append(review) 

とあなたのpd.DataFrameを作成して返すようにその辞書を使用します。

return pd.DataFrame(items, columns=['Ratings', 'Reviews']) 

columns引数は単に列の順序を設定します。スキップすることはできますが、列の順序は変わる可能性があります(辞書が順序どおりでないためed)。

zip()を使用すると、サイトと評価の両方を同時に繰り返すことができます。zip()は、最短の繰り返し処理の最後で停止することがわかります。最長で停止したい場合は、itertools.zip_longest()を代わりに使用してください。

from itertools import zip_longest 
for site, rating in zip_longest(sites, ratings) 
+0

こんにちは@ j4ck..hanksのヘルプです。あなたのコードは確かにリストの依存関係の事を削除しましたが、私は次のような新しいエラーがあります:ValueError:配列はすべて同じ長さでなければなりません レビュー数ページの評価はありますが、私はアイテムを2回初期化しているので、いくつかの不一致があると思います。これに関して私を助けてください。 –

+0

Initializinの 'item'は2回は問題ではありません。リストの長さが変わるだけで、レビューや評価(またはいくつか)が除外されます。私は以前にスパイダーを使ったことはありませんでした。私はそれに精通していません。 別のループusinz 'zip()'を追加します - あなた自身でそれをデバッグする必要があります。 – nlsdfnbch

+0

'len(sites)、len(ratings)'を印刷して、最初の入力が実際に同じ長さであるかどうかを確認することができます。 – nlsdfnbch