2017-09-08 19 views
-1

複数のアイテムが1つのセルに含まれているテーブルをダウンロードしようとしています。 私は三つの問題得る:ウェブスクレイピングでセル内に複数の行が表示される

  1. トラックリスト列が正しく生成されていない(次の行のヘッダに記述されたように(他のデータ型と同じ行をotのinstedされる)];最後内
  2. 曲コラム(トラックリスト)一つのセルに埋め込まれていないと私は書式設定複数行を取り除くための方法を見つけることができませんでした。
  3. ダウンロードがエラー

    "UnicodeEncodeError: 'charmap' codec can't encode character '\x91' in position 2886: character maps to < undefined >"

    のために1990年に停止し、私はいくつかの答えを見つけましたしかし、私 依然として問題を確実に解決する方法を理解することはできません。私は昨日同じ問題を抱えていました。オンラインで読むと、システムによって認識されない奇妙なキャラクターが含まれているようです。問題を確実に解決する方法はありませんか(私はCSVをエクセル用にエクスポートします)。 (私は@Anuragからの提案を試みた後に)

これはコードである:

import codecs 
import urllib 
import urllib.request 
from bs4 import BeautifulSoup 
from urllib.request import urlopen as uReq 
import unicodecsv as csv 
years = list(range(1965,2016)) 

for year in years: 
    my_urls = ('http://www.hitparadeitalia.it/hp_yenda/lpe' + str(year) + '.htm',) 
    my_url = my_urls[0] 
    for my_url in my_urls: 
     uClient = uReq(my_url) 
     html_input = uClient.read() 
     uClient.close() 
     page_soup = BeautifulSoup(html_input, "html.parser") 
     [s.extract() for s in page_soup('script')] 
     filename = "ALBUM" + str(year) + ".csv" 
     f = open(filename, "w") 
     headers = "NN, album, interprete, etichetta, mass, tracklist" + "/n" 
     f.write(headers) 
     containers = page_soup.findAll("table", {"class":"piccolo"}) 
     containerr = containers[0].findAll("tr") 
     container = containerr[0] 
     for container in containerr: 
      items = container.findAll("td") 
      NN = items[0].text 
      album = items[1].text 
      interprete = items[2].text 
      etichetta = items[3].text 
      mass = items[4].text 
      tracklist = items[5].text.strip() 

      print("NN: " + NN) 
      print("album: " + album) 
      print("interprete: " + interprete) 
      print("etichetta: " + etichetta) 
      print("mass: " + mass) 
      print("tracklist: " + tracklist) 

      f.write(NN + "," + album + "," + interprete + "," + etichetta + "," + mass + "," + tracklist + "\n") 
     f.close() 

I印刷機能出力から参照:最初の行が正しくによって生成さ

  1. 各列タイトルにデータを添付する。
  2. 2行目以降は、次の行のすべてのテキストをスローするよりも、トラックリストの列まで機能し、同じ、間違った、繰り返しを繰り返すことで次の行から再開します。

この問題を理解する最も良い方法は、コードを実行し、出力を表示することです(スクロールすると、繰り返しの問題をクリアする必要があります)。

答えて

0
...  
for container in containerr: 
    items = container("td") 
    NN = items[0].text.encode('utf-8','ignore') 
    album = items[1].text.encode('utf-8','ignore') 
    interprete = items[2].text.encode('utf-8','ignore') 
    etichetta = items[3].text.encode('utf-8','ignore') 
    mass = items[4].text.encode('utf-8','ignore') 
    tracklist = items[5].text.encode('utf-8','ignore') 

    print("NN: " + NN) 
    print("album: " + album) 
    print("interprete: " + interprete) 
    print("etichetta: " + etichetta) 
    print("mass: " + mass) 
    print("tracklist: " + tracklist) 
... 

あなたはutf-8またはasciiにあなたの出力をencodeすることができます。

+0

utf-8を取得するためにcsvに通知する必要があるため、うまくいきません。別の投稿に示唆されているように、私はf = open(ファイル名、 "w"、 "utf-8")を試しましたが、うまくいきません。 –

+0

'python2。+'を使用している場合は、 'ascii'に偶然エンコードするスタイル –

+0

私はPython 3を使用しています –

関連する問題