Python、Beautifulsoup、CSV 数组输出

Python, Beautifulsoup, CSV Array Output

我想弄清楚这个问题已经有一段时间了..但作为 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')

上面的 'Print Output' 是我希望 csv 输出的样子..但是当我为 csv 编写器添加代码时,我只从数组中获取最后一行数据:

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

假设与 CSV 相关的代码在循环内,问题是您一遍又一遍地创建文件:

with open("hello world.csv",'wb') as f:

the docs 中所述,模式 w 适用于:

… writing (truncating the file if it already exists)

如果您想附加到现有文件而不是截断文件并重新开始,请使用模式 a

但是,更简单的解决方案是只打开文件一次。将 with openwr = csv.writer 行移到 循环。然后,每次通过循环,只需将更多行写入现有 wr.


如果 CSV 代码 不在 循环内,那么您还有一个问题:您甚至 尝试 写多行;您只是遍历所有行,然后在完成后写入最后一行。

如果是这种情况,您需要缩进 writerows 以成为循环的一部分,并进行其他修复。


此外,作为旁注,如果您想写入单行,则无需创建包含该行的单元素列表以传递给 writerows, just call writerow 和该行。