Python+BeautifulSoup爬取网页表格后,如何将数据格式化为CSV?
搞定网页表格转CSV:新手友好的方案
嘿,作为新手能写出爬虫框架已经很棒了!针对你要把左侧加粗标签和右侧内容一一对应存CSV的需求,我给你两种实用方案,都是简单易上手的:
核心思路
首先得明确网页里的表格结构(假设是每行一个“加粗标签+对应内容”的组合):我们要遍历每一行,提取左侧<strong>里的文本作为键,右侧单元格的文本作为值,然后把这些键值对合理写入CSV。
方案1:每行存一组“标签+内容”(直观易调试)
这种方式适合快速查看所有字段,或者表格字段不固定的情况,代码注释很详细,跟着改就行:
import requests import csv from datetime import datetime from bs4 import BeautifulSoup # 替换成你的目标网页URL myurl = "https://example.com/target-page" try: # 发送请求并检查是否成功 response = requests.get(myurl) response.raise_for_status() except requests.exceptions.RequestException as e: print(f"请求网页失败: {e}") exit() # 解析HTML soup = BeautifulSoup(response.text, 'html.parser') # 定位右侧表格(替换成你实际的表格选择器,比如class/id) # 可以用soup.prettify()查看页面结构,找到表格的特征 right_table = soup.find("table", class_="right-sidebar-table") if not right_table: print("找不到目标表格!请检查选择器是否正确") exit() # 存储提取到的键值对 data_rows = [] # 遍历表格的每一行 for row in right_table.find_all("tr"): cells = row.find_all("td") # 确保每行有两个单元格(标签列+内容列) if len(cells) == 2: # 提取左侧加粗标签(如果没有加粗就直接取单元格文本) label_elem = cells[0].find("strong") label = label_elem.get_text(strip=True) if label_elem else cells[0].get_text(strip=True) # 提取右侧内容,清理多余空格换行 value = cells[1].get_text(strip=True) # 加入列表 data_rows.append({"标签": label, "内容": value}) # 生成带时间戳的文件名,避免覆盖旧文件 timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") csv_filename = f"表格数据_{timestamp}.csv" # 写入CSV(用utf-8-sig避免Excel打开乱码) with open(csv_filename, "w", encoding="utf-8-sig", newline="") as csv_file: writer = csv.DictWriter(csv_file, fieldnames=["标签", "内容"]) writer.writeheader() # 写入表头 writer.writerows(data_rows) # 写入所有数据行 print(f"数据已成功保存到 {csv_filename}")
方案2:把标签作为表头,一行存所有内容(适合单条实体数据)
如果爬取的是单个实体(比如某家公司、某个人的信息),这种方式更规整,CSV里表头就是所有加粗标签,一行是对应的值:
# 前面的请求、解析、表格定位部分和方案1完全一致,这里省略... # 用字典存储所有键值对 data_dict = {} for row in right_table.find_all("tr"): cells = row.find_all("td") if len(cells) == 2: label_elem = cells[0].find("strong") label = label_elem.get_text(strip=True) if label_elem else cells[0].get_text(strip=True) value = cells[1].get_text(strip=True) data_dict[label] = value # 写入CSV timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") csv_filename = f"实体信息_{timestamp}.csv" with open(csv_filename, "w", encoding="utf-8-sig", newline="") as csv_file: # 用字典的键作为CSV表头 writer = csv.DictWriter(csv_file, fieldnames=data_dict.keys()) writer.writeheader() writer.writerow(data_dict) # 写入一行数据 print(f"数据已成功保存到 {csv_filename}")
新手必看小贴士
- 调试优先:先把
label和value打印出来,确认提取正确后再写入CSV,避免白忙活。 - 适配HTML结构:如果你的表格不是
<tr>+<td>的结构,用soup.prettify()打印页面源码,找到正确的元素选择器。 - 编码避坑:一定要用
utf-8-sig编码保存CSV,不然Excel打开会乱码。 - 异常处理:代码里加了请求失败、找不到表格的判断,能避免程序直接崩溃,新手一定要养成这个习惯!
内容的提问来源于stack exchange,提问作者kdrumz
相关产品推荐
相关产品推荐

