0

我正在使用以下代码,它运行良好,除了我的代码从 Excel 吐出到一个 CSV 文件并且它跳过每隔一行。我在stackoverflow.com中搜索了 csv 模块文档和其他示例,我发现我需要使用 DictWriter 并将 lineterminator 设置为 '\n'。我自己将其写入代码的尝试已被挫败。

所以我想知道有没有办法让我将这个(作为 lineterminator)应用到整个文件中,这样我就不会跳过任何行?如果是这样怎么办?

这是代码:

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

首先,由于 Yahoo 提供了一个返回 CSV 文件的 API,也许您可​​以通过这种方式解决您的问题?例如,此 URL返回一个 CSV 文件,其中包含该行业所有股票的价格、市值、市盈率和其他指标。在这个 Google Code 项目中有更多信息。

您的代码仅生成两行 CSV,因为只有两次调用f.writerow(). 如果您想要从该页面获得的唯一数据是市盈率,那么这几乎肯定不是最好的方法,但您应该传递给f.writerow()包含每列值的元组。为了与您的标题行保持一致,这将类似于:

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

当然,这是假设市盈率总是排在第二位的。相反,如果您想要该页面上提供的所有统计信息,您可以尝试:

# 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 回答
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 回答