python web抓取数据到csv
Posted
技术标签:
【中文标题】python web抓取数据到csv【英文标题】:python web scraping data to csv 【发布时间】:2022-01-24 03:50:09 【问题描述】:我尝试使用 python 网页抓取然后输出一个 csv 文件,但打印格式与 csv 格式不匹配。
输出enter image description here
如何打印这个预期结果? enter image description here
谢谢
下面是我的脚本
import urllib.request as req
import bs4
import csv
import pandas as pd
import re
from datetime import date, timedelta
def daterange(start_date, end_date):
for n in range(int((end_date - start_date).days)):
yield start_date + timedelta(n)
start_date = date(2021, 12, 10)
end_date = date(2021, 12, 15)
url="https://hkgoldprice.com/history/"
with open('gprice.csv','w',newline="") as f1:
for single_date in daterange(start_date, end_date):
udate = single_date.strftime("%Y/%m/%d")
urld = url + single_date.strftime("%Y/%m/%d")
writer=csv.writer(f1,delimiter = '\t',lineterminator='\n',)
writer.writerows(udate)
print(udate)
with req.urlopen(urld) as response:
data=response.read().decode("utf-8")
root=bs4.BeautifulSoup(data, "html.parser")
prices=root.find_all("div",class_="gp")
gshops=root.find_all("div",class_="gshop")
gpdate=root.find_all("div",class_="gp_date")
for price in prices:
print(price.text)
row = price
writer.writerows(row)
【问题讨论】:
【参考方案1】:第一个问题是你使用“writerows”,它会导致 csv 写入尽可能多的行。所以当你的文本是“2021/12/23”时,转换器会变成['2', '0', '2', '1', '/', '1', '2', '/', '2', '3'],每行写一个字符。和价格一样的问题。因此我们使用“writerow”并将行数据保存为列表,以防止 csv 将我们的数据转换为多行。
第二个是在 BeautifulSoup 中使用.text
将记录所有文本,包括空格和导致 csv 行为不可预测。所以我会先把所有的空格和#
删除,防止出现这种情况。
这是修改后的代码
with open('gprice.csv','w',newline="") as f1:
for single_date in daterange(start_date, end_date):
udate = single_date.strftime("%Y/%m/%d")
urld = url + single_date.strftime("%Y/%m/%d")
#we will append row by row, so we just use default setting on csv write
writer=csv.writer(f1)
#define empty row list
row_list = []
#append datetime
row_list.append(udate)
with req.urlopen(urld) as response:
data=response.read().decode("utf-8")
root=bs4.BeautifulSoup(data, "html.parser")
prices=root.find_all("div",class_="gp")
gshops=root.find_all("div",class_="gshop")
gpdate=root.find_all("div",class_="gp_date")
for price in prices:
#get inner text and delete '#'
row = price.text.replace('#', '')
#delete all whitespaces and append price
row_list.append("".join(row.split()))
#we only append one row data, so use "writerow" instad of "writerows"
writer.writerow(row_list)
【讨论】:
以上是关于python web抓取数据到csv的主要内容,如果未能解决你的问题,请参考以下文章