一段时间以来,我一直在试图解决这个问题..但是对于Python和BS来说,我并不陌生。这是代码:
import urllib2
import csv
from bs4 import BeautifulSoup
urls = ["https://coinmarketcap.com/currencies/bitcoin/historical-data/",
"https://coinmarketcap.com/currencies/ethereum/historical-data/",
"https://coinmarketcap.com/currencies/ripple/historical-data",
"https://coinmarketcap.com/currencies/bitcoin-cash/historical-data",
"https://coinmarketcap.com/currencies/litecoin/historical-data"]
for url in urls:
page = urllib2.urlopen(url)
soup = BeautifulSoup(page, "html.parser")
row = soup.find("tr", attrs={"class":"text-right"})
row2 = row.find_all("td")
print (row2[0].text, row2[1].text, row2[2].text, row2[3].text, row2[4].text, row2[5].text)
Print Output:
(u'Aug 08, 2018', u'6746.85', u'6746.85', u'6226.22', u'6305.80', u'5,064,430,000')
(u'Aug 08, 2018', u'379.89', u'380.67', u'353.73', u'356.61', u'2,016,080,000')
(u'Aug 08, 2018', u'0.380875', u'0.380875', u'0.326996', u'0.331944', u'360,857,000')
(u'Aug 08, 2018', u'660.05', u'660.05', u'575.64', u'585.45', u'450,595,000')
(u'Aug 08, 2018', u'68.16', u'68.16', u'62.14', u'62.49', u'313,187,000')
上面的“打印输出”就是我想要csv输出的样子。但是,当我添加csv writer的代码时,我只能从数组中获取最后一行数据:
with open("hello world.csv",'wb') as f:
wr = csv.writer(f)
wr.writerows([(row2[0].text, row2[1].text, row2[2].text, row2[3].text, row2[4].text, row2[5].text)])
writerows Output:
(u'Aug 08, 2018', u'68.16', u'68.16', u'62.14', u'62.49', u'313,187,000')
任何使csv输出与打印相同的帮助都将得到极大的帮助!
非常感谢,
OM
答案 0 :(得分:1)
假设循环中包含与CSV相关的代码,问题是您不断重复创建文件:
with open("hello world.csv",'wb') as f:
如the docs中所述,模式w
用于:
…编写(如果文件已经存在,则将其截断)
如果要追加到现有文件而不是截断文件并重新开始,请使用模式a
。
但是,更简单的解决方案是只打开文件一次。将with open
和wr = csv.writer
行移到循环的 之外。然后,每次循环,只需将更多行写入现有的wr
。
如果循环中没有CSV代码 ,那么您还有一个问题:您甚至没有尝试编写多行;您只是循环遍历所有行,然后在完成后编写最后一行。
在这种情况下,您需要缩进writerows
以使其成为循环的一部分,并进行其他修复。
此外,请注意,如果您只想写一行,则无需创建该行的单元素列表以传递给writerows
,只需使用{行。