【问题标题】:Trouble dealing with header in a csv file处理 csv 文件中的标头时遇到问题
【发布时间】:2018-04-07 11:34:41
【问题描述】:

我使用 python 编写了一些代码来从网页中抓取一些标题和价格,并将结果写入 csv 文件。脚本运行得很棒。当我将数据附加到 csv 文件时,脚本正在以这样的方式写入标题,如果它运行 4 个循环,那么标题将被写入 4 次。如何修复它,以便将标题写入一次。谢谢。

这是脚本:

import csv
import requests
from bs4 import BeautifulSoup

diction_page = ['http://www.bloomberg.com/quote/SPX:IND','http://www.bloomberg.com/quote/CCMP:IND']

for link in diction_page:
    res = requests.get(link).text
    soup = BeautifulSoup(res,'lxml')
    title = soup.select_one('.name').text.strip()
    price = soup.select_one('.price').text
    print(title,price)
    with open('item.csv','a',newline='') as outfile:
        writer = csv.writer(outfile)
        writer.writerow(["Title","Price"])
        writer.writerow([title, price])

【问题讨论】:

  • writer.writerow(["Title","Price"]) 移出循环会有问题吗?您可以为整个循环保留一个文件上下文,也可以编写标题,关闭文件并继续循环

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


【解决方案1】:

作为一个选项,你可以试试这个:

import csv
import requests
from bs4 import BeautifulSoup

diction_page = ['http://www.bloomberg.com/quote/SPX:IND','http://www.bloomberg.com/quote/CCMP:IND']

for i,link in enumerate(diction_page):
    res = requests.get(link).text
    soup = BeautifulSoup(res,'lxml')
    title = soup.select_one('.name').text.strip()
    price = soup.select_one('.price').text
    print(title,price)
    with open('item.csv','a',newline='') as outfile:
        writer = csv.writer(outfile)
        if (i == 0):
            writer.writerow(["Title","Price"])
        writer.writerow([title, price])

【讨论】:

  • 感谢 Fidan,提供了这么好的解决方法。我期待这样的事情。非常感谢。
  • 还有一件事要知道:当在for i,year in enumerate(range(1947,1950),1): 中的 for 循环中有要处理的范围时该怎么办。我试过了,但在这种情况下它不起作用。我做了相应的事情吗?谢谢。
  • enumerate 函数中的第二个参数用于开始编号 i。看看这个enumerate。你真的想从 1 开始,而不是从 0 开始 i
  • @Fidan,感谢上帝,您回复了。我对枚举一​​无所知。我尝试了几种不同的方法,但发现了错误的结果。只是给我一个想法,如何在那里写不会重复的标题。请注意查看此链接dropbox.com/s/7u039c75lytouwk/for%20Fidan.txt?dl=0 再次感谢。
  • 我认为@Ken Wei 的更正答案对你来说会更好更正确。只需保持文件打开,写入标题,然后在循环中写入数据。
【解决方案2】:

不要在for循环中写标题:

import csv
import requests
from bs4 import BeautifulSoup

diction_page = ['http://www.bloomberg.com/quote/SPX:IND','http://www.bloomberg.com/quote/CCMP:IND']

outfile = open('item.csv','w',newline='')
writer = csv.writer(outfile)
writer.writerow(["Title","Price"])

for link in diction_page:
    res = requests.get(link).text
    soup = BeautifulSoup(res,'lxml')
    title = soup.select_one('.name').text.strip()
    price = soup.select_one('.price').text
    print(title,price)
    writer.writerow([title, price])
outfile.close()

【讨论】:

  • 为什么不让文件保持打开状态而不是在循环中追加?
  • @Ken Wei,我之前使用了您建议的方法,在这种情况下,with open('item.csv','a',newline='') as outfile: writer = csv.writer(outfile) 是完全多余的。无论如何,谢谢。
猜你喜欢
  • 2019-04-24
  • 2022-09-23
  • 1970-01-01
  • 2016-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-15
相关资源
最近更新 更多