【问题标题】:Python, Beautifulsoup, CSV Array OutputPython、Beautifulsoup、CSV 数组输出
【发布时间】:2018-08-09 04:45:35
【问题描述】:

我一直在尝试解决这个问题。但对于 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 编写器添加代码时,我只能从数组中获取最后一行数据:

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

【问题讨论】:

    标签: python csv beautifulsoup urllib2


    【解决方案1】:

    假设与 CSV 相关的代码在循环内,问题是你不断地创建文件:

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

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

    …正在写入(如果文件已经存在则截断)

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

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


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

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


    另外,作为旁注,如果你想写一行,没有必要创建一个包含该行的单元素列表传递给writerows,只需调用writerow 与该行。

    【讨论】:

      猜你喜欢
      • 2017-08-12
      • 2014-03-07
      • 1970-01-01
      • 2018-08-11
      • 2018-02-18
      • 2017-05-28
      • 2021-03-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多