2016-11-17 1 views
-1

私は現在、美味しいスープでレビューサイトをクロールしています。レビューウェブをこする質問

レビューページには、異なる学生からのレビューが含まれています。 と各生徒は、いくつかの側面で学校を評価します。

ので、ページの構造は、一般的に次のようになります。

  1. 学生A - タイトルA:

    • 様相1
    • 側面に向けてコメント1
    • aspect2アスペクト2のコミット
    • aspe

      • 縦横2
      • の様相1
      • aspect2 commetに向けて側面1件の
      • コメント:タイトルB - 縦横3
    • 学生BのCT3

    • commetアスペクト4
    • com

のみ特定の側面についてのコメントをした一部の学生請求項4に会いました。彼らがコメントしていない側面はウェブサイトには表示されません。


コード内の各レビュー

 <!-- mod-reviewTop --> 
    <div class="mod-reviewTop"> 
     <!-- mod-reviewTop-inner --> 
     <div class="mod-reviewTop-inner"> 
     <dl> 
     <dd> 
     <div class="mod-reviewTitle" itemprop="summary"> 
      title 1 : It was ok. 
     </div> 
     </dd> 
     </dl> 
     <!-- /mod-reviewItem --> 
    </div> 
    <!-- /mod-reviewTop --> 
    <!-- mod-reviewBottom --> 
    <div class="mod-reviewBottom"> 
     <!-- mod-reviewList-list --> 
     <div class="mod-reviewList-list js-review-detail" itemprop="description"> 
     <!-- js-mod-reviewList-list --> 
     <div class="js-mod-reviewList-list"> 
     <ul> 
     <li> 
      <div class="mod-reviewTitle3"> 
      Total Evaluation 
      </div> 
      <div class="mod-reviewList-txt"> 
      We can freely choose the course we want, and thus a lot of different knowledge can be learned. 
      </div> 
     </li> 
     <li> 
      <div class="mod-reviewTitle3"> 
      Course 
      </div> 
      <div class="mod-reviewList-txt"> 
      the courses are good. 
      </div> 
     </li> 
     <li> 
      <div class="mod-reviewTitle3"> 
      Lab 
      </div> 
      <div class="mod-reviewList-txt"> 
      we don’t join lab in the first 2 year. 
      </div> 
     </li> 
     </ul> 
     </div> 
     <!-- /js-mod-reviewList-list --> 
     </div> 
     <!-- /mod-reviewList-list --> 
    </div> 
    <!-- /mod-reviewBottom --> 
あなたは側面のタイトルが異なっていても、それらはすべて「のdivクラス= 『MOD-reviewTitle3』」 で始まり、そしてことがわかります

コメントはすべてで始まります 'div class = "mod-reviewList-txt"'。 私の質問は、データセットにこれらの情報を格納するための良いコードを書くにはどうすればいいのですか?

|タイトル|アスペクト1コメント| aspect2コメント
私はプログラミングの問題としてこれを考えて、私は

各ブロックのdoesntのワークウェルで
datatest = soup.find_all("div", {"class":"mod-reviewTop"}) 
datatest1 = soup.find_all("div", {"class":"mod-reviewBottom"}) 

for item in datatest: 
    a = item.select('.mod-reviewTitle')  
    c = item.select('.mod-reviewTitle3') 
    d = item.select('.mod-reviewList-txt') 
    g = item.select('.js-mod-reviewList-list') 
    f= item.select('.mod-reviewItem') 

for i in range(len(a)): 
    f1= f[i].text[7] 
    f2= f[i].text[17] 
    f3= f[i].text[26] 
    f4= f[i].text[37] 
    f5= f[i].text[46] 
    f6= f[i].text[55] 
    f7= f[i].text[63] 

    print a[i].text 
    print f1, f2, f3, f4, f5, f6, f7 
    for item in datatest1: 
     for k in range(len(g)): 
      print g[k].text 
      print e[k].text 
      print k 

を以下のコードが、アスペクトコメントを試してみました非常に素晴らしい

良い.. 私はループを試してきたが、

あなたが親切に私の参照を与えることができるか、構造が論理的にどのように機能するか、plsが親切に私にコメントを残すならば。おかげ

+0

ここでは、すべての記事を書き留めていない問題についてのみ説明してください。あなたの質問は何ですか?データセットに情報を格納するための良いコードを書くには?何が良いコードですか?とにかく、あなたはパンダを使ってデータセットにデータを格納できます。xlwtを使用してExcelファイルに書き込むことも、独自の区切り文字でテキストファイルに書き込むこともできます。 – mid

答えて

1

ヒント:

  • あなたは適切なデータ構造を使用してそれらを一緒に保存することを意味する、titlesに対応するaspectscommentsを添付しなければなりません。必要なデータを取得するとき、この(ちょうど1つの可能な方法)

    [ (title1,[ (aspect1, comment1), (aspect2, comment2), ... ]), (title2,[ (aspect1, comment1), (aspect2, comment2), ... ]), ... ]

  • ようなので、ネストされたforループでの操作を整理します。つまり、アスペクトを見つけたら、たとえば、対応するコメントを取得して一緒に保存します。エスケープしてすべての側面を見つけ、すべてのコメント。

ここでコード

はデモです。

blocks = soup.find_all("div", {"class":"mod-reviewTop"}) 
contents = soup.find_all("div", {"class":"mod-reviewBottom"}) 
data = [] 

for i,block in enumerate(blocks): 
    aspects = [] 
    title = str(block.find('div',{'class':'mod-reviewTitle'}).text).strip() 
    for aspect_block in contents[i].find_all('li'): 
     aspect = str(aspect_block.find('div',{'class':'mod-reviewTitle3'}).text).strip() 
     comment = str(aspect_block.find('div',{'class':'mod-reviewList-txt'}).text).strip() 
     aspects.append((aspect,comment)) 
    data.append((title,aspects)) 

print data 

with open("output.txt","w") as file: 
    for title, aspects in data: 
     file.write(title) 
     for aspect in aspects: 
      file.write('|'+aspect[0]+'\t'+aspect[1]) 
     file.write('\n')