1

廃棄されたデータをWebサイトからcsvファイルに出力しようとしています。最初に、UnicodeEncodingエラーが発生しましたが、このコードを使用した後、次のようになります。

if __name__ == "__main__":
reload(sys)
sys.setdefaultencoding("utf-8")

csvを生成できます。以下は同じコードです。

import csv
import urllib2
import sys  
from bs4 import BeautifulSoup
if __name__ == "__main__":
    reload(sys)
    sys.setdefaultencoding("utf-8")
page =    urllib2.urlopen('http://www.att.com/shop/wireless/devices/smartphones.html').read()
soup = BeautifulSoup(page)
soup.prettify()
for anchor in soup.findAll('a', {"class": "clickStreamSingleItem"}):
        print anchor['title']        
        with open('Smartphones.csv', 'wb') as csvfile:
                spamwriter = csv.writer(csvfile, delimiter=',')        
                spamwriter.writerow([(anchor['title'])])     

しかし、出力csvで取得しているデバイス名は1つだけです。プログラミングのバックグラウンドはありません。無知であることをお許しください。この問題を特定するのを手伝ってもらえますか?

4

1 に答える 1

1

これは当然のことです。要素を見つけるたびに、ファイルをゼロから作成します。リンクをループする前にファイルを 1だけ開き、見つかったアンカーごとに行を書き込みます。

with open('Smartphones.csv', 'wb') as csvfile:
    spamwriter = csv.writer(csvfile, delimiter=',')        
    for anchor in soup.findAll('a', {"class": "clickStreamSingleItem"}):
        print anchor['title']        
        spamwriter.writerow([anchor['title'].encode('utf8')])   

書き込み用にファイルを開くと、w最初にファイルがクリアされます。アンカーごとにそれを行っていました。

Unicode エラーに関しては、デフォルトのエンコーディングを変更することは絶対に避けてください。代わりに、行を適切にエンコードしてください。上記の例ではそうしましたが、.setdefaultencoding()呼び出し全体 (およびそのreload()前) を削除できます。

于 2012-12-19T08:11:25.923 に答える