2011-07-01 4 views
0

URLのリストをurllib2とBeautifulSoupを使用してWebページからスクレイプしているcsvファイルに入れようとしています。私はユニコードとしてcsvファイルへのリンクを書き、utf-8にも変換しようとしました。どちらの場合も、各文字は新しいフィールドに挿入されます。Python CSVで各文字を新しいフィールドに入れたときの問題

はここに(私は、少なくともこれら2つの方法でそれを試してみた)私のコードです:

f = open('filename','wb') 
w = csv.writer(f,delimiter=',') 
for link in links: 
    w.writerow(link['href']) 

そして:

[<a href="#Flyout1" accesskey="2" class="quicklinks" tabindex="1" title="Skip to content">Quick Links: Skip to main page content</a>, <a href="#search" class="quicklinks" tabindex="1" title="Skip to search">Skip to Search</a>, <a href="#News" class="quicklinks" tabindex="1" title="Skip to Section table of contents">Skip to Section Content Menu</a>, <a href="#footer" class="quicklinks" tabindex="1" title="Skip to site options">Skip to Common Links</a>, <a href="http://www.hhs.gov"><img src="/ucm/groups/fdagov-public/@system/documents/system/img_fdagov_hhs_gov.png" alt="www.hhs.gov link" style="width:112px; height:18px;" border="0" /></a>] 

f = open('filename','wb') 
w = csv.writer(f,delimiter=',') 
for link in links: 
    w.writerow(link['href'].encode('utf-8')) 

linksはこのようになりますリストです

すべてのリンクに'href'というキーがあるわけではありませんが、ここでは表示されていないコードでチェックしています。どちらの場合も、正しい文字列がcsvファイルに書き込まれますが、各文字は新しいフィールドにあります。

どのような考えですか?

答えて

6

docsより:「行は一連の文字列または数字でなければなりません...」文字列のシーケンスではなく単一の文字列を渡すので、各文字を項目として扱います。あなたの文字列をリストに入れてください。

w.writerow(link['href'])からw.writerow([link['href']])に変更してください。

注:単一の列を持つcsvファイルは、フラットテキストファイルのように見えます。たぶん、CSVは必要ありません。

+0

Rumbalskiすぐに助けてくれてありがとう。私はPHPの背景から来て、Pythonのリスト、辞書、タプルはループのために私を投げます。 'TypeError:文字列インデックスは整数でなければならない ' – tchaymore

+1

@tchaymoreエラーは文字列にインデックスを付けるために使用している' href''からのものです。あなたはそれをすることはできません。整数を使用して、文字列内の地点を参照することができます。しかし、文字列ではありません。あなたのリンク変数があなたが望んでいたものではないと思います( ''タグ内の属性の辞書)。 –

2

"新しい文字列に挿入された各文字"というのは、このようなものだと思いますよね?

h,t,t,p,:,/,/,w,w,w,.,g,o,o,g,l,e,.,c,o,m 

もしそうなら、writerow()はあなたの文字列内の文字を反復処理し、それらのように異なる列を解釈しています。代わりにwriterow([link['href']])を使用してみてください。

:@Steven Rumbalskiのように見えますが、これにパンチしてください!

2

the docsによると、writerow()は反復可能オブジェクトを取り、それを反復して、そのCSV表現を出力します。あなたの問題は、文字列は反復可能なオブジェクトです。私が持っている場合:

for c in mystring: 
    print c 

そして私が買ってあげる::

mystring = 'foo' 

Pythonは、私はそうのように反復処理できるようになる

f 
o 
o 

便利な機能だが、それはあなたに対して働いていますこの場合。カンマ、ではない文字で文字列を分離する - あなたはwriterow()文字列上itterateしたくない

、あなたはそれが文字列のリストをオーバーitterateたいです。そのような場合は、以下のように文字列からリストを作成したいと思うでしょう:

関連する問題