Python使用BeautifulSoup爬取键值对转DataFrame写入CSV方法
船舶IMO爬虫数据转存Pandas导出CSV实现方案
核心逻辑:遍历IMO编号时将单条船舶的属性键值对存为字典,所有船舶数据汇总为列表后一次性转换为DataFrame,自动对齐表头后导出CSV文件。
完整实现代码
import pandas as pd from bs4 import BeautifulSoup # 按你实际使用的请求库导入,示例以requests为例 import requests # 初始化存储所有船舶数据的总列表 all_ships_data = [] # 替换为你实际的IMO编号列表 imos = [9636632, ...] for imo in imos: # 保留你原有的请求、页面解析逻辑 # resp = requests.get(f"你的目标页面地址?imo={imo}", headers=你的请求头参数) # soup = BeautifulSoup(resp.text, "html.parser") # 注意:原代码此处class参数写法有误,集合要改为字典键值对格式 keys_div = soup.find_all("div", {"class": "col-4 keytext"}) values_div = soup.find_all("div", {"class": "col-8 valuetext"}) # 初始化单条船舶的属性字典 single_ship = {} for key, value in zip(keys_div, values_div): # 提取文本并清除首尾空白、换行符 key_text = key.text.strip() value_text = value.text.strip() # 处理重复key:避免同名字段被后值覆盖,自动给重复key加数字后缀 suffix = 1 original_key = key_text while key_text in single_ship: key_text = f"{original_key}_{suffix}" suffix += 1 single_ship[key_text] = value_text # 单条船数据加入总列表 all_ships_data.append(single_ship) # 转换为DataFrame,自动将所有出现过的属性作为表头,缺失值自动填充为NaN ship_df = pd.DataFrame(all_ships_data) # 导出CSV,utf-8-sig编码兼容Excel直接打开不乱码,index=False去掉默认行号列 ship_df.to_csv("船舶IMO属性数据.csv", encoding="utf-8-sig", index=False)
关键注意点
- 文本清洗:所有提取的键、值都用
.strip()清除首尾的空格、换行、制表符,避免表头带多余空白导致同名字段无法对齐 - 重复字段处理:你给出的示例输出存在命名重复/同义不同名的字段(比如重复出现的
Deadweight、命名差异的Shiptype/ShipType、Year of Build/Built、Gross/GT),代码已经做了重复key自动加后缀的兼容,如果需要合并同义字段,可以在生成单船字典时手动做key映射统一命名 - 异常兼容:如果爬取数据量较大,建议在单条IMO的请求、解析逻辑外层加
try-except捕获异常,单条数据爬取失败时打印对应IMO编号后跳过,避免整个任务中断 - 结果校验:代码运行后可以执行
print(ship_df.head())查看前5行数据,确认表头和数值匹配正确再使用导出的文件
内容的提问来源于stack exchange,提问作者logesh
相关产品推荐
相关产品推荐

