0

次のコードを使用していますが、コードが Excel から CSV ファイルに出力され、1 行おきにスキップされるという事実を除いて、うまく機能します。csvモジュールのドキュメントとstackoverflow.comの他の例をグーグルで調べたところ、ラインターミネーターを「\ n」に設定してDictWriterを使用する必要があることがわかりました。それをコードに書き込もうとする私自身の試みは失敗しました。

それで、行がスキップされないように、これをファイル全体に適用する方法があるのでしょうか。もしそうなら、どのように?

コードは次のとおりです。

import urllib2
from BeautifulSoup import BeautifulSoup
import csv

page = urllib2.urlopen('http://finance.yahoo.com/q/ks?s=F%20Key%20Statistics').read()

f = csv.writer(open("pe_ratio.csv","w"))
f.writerow(["Name","PE"])

soup = BeautifulSoup(page)
all_data = soup.findAll('td', "yfnc_tabledata1")
f.writerow([all_data[2].getText()])

事前にご協力いただきありがとうございます。

4

2 に答える 2

0

csv.writerクラスが正しく機能するには、適切なオプションでファイルを開く必要があります。モジュールは内部的にユニバーサルな改行サポートを持っているので、ファイル レベルで Python のユニバーサルな改行サポートをオフにする必要があります。

Python 2 の場合、ドキュメントには次のように記載されています。

がファイル オブジェクトの場合、違いが生じるプラットフォームでcsvfileはフラグを指定して開く必要があります。'b'

Python 3の場合、彼らは次のように言います

がファイル オブジェクトの場合csvfileは、 で開く必要がありますnewline=''

また、おそらく次のwithように、ファイルの開閉を処理するステートメントを使用する必要があります。

with open("pe_ratio.csv","wb") as f: # or open("pe_ratio.csv", "w", newline="") in Py3
    writer = csv.writer(f)

    # do other stuff here, staying indented until you're done writing to the file
于 2013-10-30T06:37:47.373 に答える
0

まず、Yahoo は CSV ファイルを返す API を提供しているので、その方法で問題を解決できるのではないでしょうか? たとえば、この URLは、その業界のすべての株式の価格、時価総額、PER、およびその他の指標を含む CSV ファイルを返します。この Google コード プロジェクト には、さらに詳しい情報があります。

への呼び出しが 2 つしかないため、コードは 2 行の CSV しか生成しませんf.writerow()。そのページから取得したい唯一のデータが P/E 比率である場合、これが最善の方法ではないことはほぼ確実ですがf.writerow()、各列の値を含むタプルに渡す必要があります。ヘッダー行と一致させるには、次のようにします。

f.writerow( ('Ford', all_data[2].getText()) )

もちろん、これは P/E 比率が常にリストの 2 番目になることを前提としています。代わりに、そのページで提供されるすべての統計が必要な場合は、次を試すことができます。

# scrape the html for the name and value of each metric
metrics = soup.findAll('td', 'yfnc_tablehead1')
values = soup.findAll('td', 'yfnc_tabledata1')

# create a list of tuples for the writerows method
def stripTag(tag): return tag.text
data = zip(map(stripTag, metrics), map(stripTag, values))

# write to csv file
f.writerows(data)
于 2013-10-30T05:57:11.713 に答える