【问题标题】:Unable to write data across columns in a csv file无法跨 csv 文件中的列写入数据
【发布时间】:2018-08-25 14:43:07
【问题描述】:

我在 python 中编写了一个脚本,用于从网页的表格中抓取不同的名称及其值,并将其写入 csv 文件中。我下面的脚本可以完美地解析它们,但我不能以自定义的方式将它们写入 csv 文件。

我想做的是跨列写namesvalues,如图2 所示。

这是我的尝试:

import csv
from bs4 import BeautifulSoup
import requests

res = requests.get("https://www.bloomberg.com/markets/stocks",headers={"User-Agent":"Mozilla/5.0"})
soup = BeautifulSoup(res.text, "lxml")
with open("outputfile.csv","w",newline="") as infile:
    writer = csv.writer(infile)
    for table in soup.select(".data-table-body tr"):
        name = table.select_one("[data-type='full']").text
        value = table.select_one("[data-type='value']").text
        print(f'{name} {value}')
        writer.writerow([name,value])

输出如下:

我希望得到的输出如下:

任何解决此问题的帮助将不胜感激。

【问题讨论】:

    标签: python python-3.x csv web-scraping


    【解决方案1】:

    尝试定义空列表,将所有值追加到循环中,然后一次全部写入:

    with open("outputfile.csv","w",newline="") as infile:
        writer = csv.writer(infile)
        names_and_values = []
        for table in soup.select(".data-table-body tr"):
            name = table.select_one("[data-type='full']").text
            value = table.select_one("[data-type='value']").text
            print(f'{name} {value}')
            names_and_values.extend([name,value])
        writer.writerow(names_and_values)
    

    【讨论】:

      【解决方案2】:

      如果我理解正确,请尝试只调用一次 writerow 而不是每个循环调用一次

      import csv
      from bs4 import BeautifulSoup
      import requests
      
      res = requests.get("https://www.bloomberg.com/markets/stocks",headers={"User-Agent":"Mozilla/5.0"})
      soup = BeautifulSoup(res.text, "lxml")
      with open("outputfile.csv","w",newline="") as infile:
          writer = csv.writer(infile)
          data = []
          for table in soup.select(".data-table-body tr"):
              name = table.select_one("[data-type='full']").text
              value = table.select_one("[data-type='value']").text
              print(f'{name} {value}')
              data.extend([name, value])
          writer.writerow(data)
      

      【讨论】:

      • 感谢@ThePoetCoder,您的代码也可以完成这项工作。希望我能接受这两个答案。
      【解决方案3】:

      这似乎是一件很丑陋的事情,你确定吗?

      使用 pandas 获取 csv 文件和操作表格。您需要执行以下操作:

      import pandas as pd
      
      df = pd.read_csv(path)
      df.values.ravel()
      

      【讨论】:

        猜你喜欢
        • 2017-06-27
        • 1970-01-01
        • 2023-03-06
        • 2014-08-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多