【问题标题】:Download a .csv file with Python使用 Python 下载 .csv 文件
【发布时间】:2014-02-01 17:03:45
【问题描述】:

我在 Windows 上使用 Python 3.3。我想弄清楚如何从 yahoo Finance 下载 .csv 文件。它是历史价格的文件。

这是我要访问的链接所在的源代码。

<p>  
 <a href="http://ichart.finance.yahoo.com/table.csv?s=AAPL&amp;d=1&amp;e=1&amp;f=2014&amp;g=d&amp;a=8&amp;b=7&amp;c=1984&amp;ignore=.csv">
<img src="http://l.yimg.com/a/i/us/fi/02rd/spread.gif" width="16" height="16" alt="" border="0">
<strong>Download to Spreadsheet</strong>
 </a>
</p> 

这是我编写的代码。

from urllib.request import urlopen
from bs4 import BeautifulSoup

website = "http://ichart.finance.yahoo.com/table.csv?s=AAPL&amp;d=1&amp;e=1&amp;f=2014&amp;g=d&amp;a=8&amp;b=7&amp;c=1984&amp;ignore=.csv"
html = urlopen(website)
soup = BeautifulSoup(html)

当我运行代码时,我希望它会开始下载并将其放入我的下载文件夹,但它什么也没做。它运行然后停止。我的下载中没有显示 csv 文件。所以我认为我在这段代码中遗漏了其他内容。

【问题讨论】:

  • 你唯一要做的就是读取 URL,用 BeautifulSoup 解析它,然后结束而不做任何其他事情。 Python 应该如何知道您要保存 url?如果您想将该文件放在您的下载文件夹中,您需要告诉 Python 这样做。
  • 我认为这正在发生。哪一行代码可以做到这一点?

标签: windows excel csv python-3.x beautifulsoup


【解决方案1】:

你可以只用 urllib 来做到这一点。以下代码下载 .csv 文件并将内容放入名为“csv”的字符串中。然后将字符串保存到文件中:

from urllib import request

# Retrieve the webpage as a string
response = request.urlopen("http://ichart.finance.yahoo.com/table.csv?s=AAPL&amp;d=1&amp;e=1&amp;f=2014&amp;g=d&amp;a=8&amp;b=7&amp;c=1984&amp;ignore=.csv")
csv = response.read()

# Save the string to a file
csvstr = str(csv).strip("b'")

lines = csvstr.split("\\n")
f = open("historical.csv", "w")
for line in lines:
   f.write(line + "\n")
f.close()

【讨论】:

  • 它制作了 .csv 文件,但没有正确写入行。
  • 我更新了保存代码。输出文件现在应该是完整的 csv 格式。
  • 谢谢!这行得通。 .strip("b'") 是什么意思?
  • response.read() 命令返回 类型的对象而不是字符串。 str(csv) 将其转换为字符串,但将字母 b 和一些引号作为转换的产物,即 b'XXXXXX' strip("b'") 将它们删除以清理数据。可能有一种更简洁的方法可以在没有工件的情况下进行转换。
  • 当然有一种更简洁的方法可以将字节解码为 un​​icode 字符串;你会使用bytes.decode( 方法。但是,由于您将整个内容保存到文件无论如何,您只需以二进制模式打开文件并直接写入响应:open('historical.csv', 'wb').write(response.read()).
【解决方案2】:

因为您已经使用 BeautifulSoup 和 urllib:

url = BeautifulSoup(html).find('a')['href']
urllib.urlretrieve(url, '/path/to/downloads/file.csv')

【讨论】:

  • 您能详细说明一下吗?我添加了这两行,路径为 'C:\Users\David\Downloads' 除非我每次运行都清除下载文件夹,否则名称会更改,因为它会将其保存为表,然后是表(1),然后是表( 2)。如果我多次运行它,依此类推。
猜你喜欢
  • 1970-01-01
  • 2020-05-25
  • 2012-11-12
  • 1970-01-01
  • 1970-01-01
  • 2019-01-15
  • 2016-02-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多