python从tr、td中拿文字并存入csv
这是标准的tr 、td格式
<table>
<tr>
<td>第一行第1列</td>
<td>第一行第2列</td>
<td>第一行第3列</td>
</tr>
<tr>
<td>第二行第1列</td>
<td>第二行第2列</td>
<td>第二行第3列</td>
</tr>
<tr>
<td>第三行第1列</td>
<td>第三行第2列</td>
<td>第三行第3列</td>
</tr>
</table>
这是通用的写法,两次for循环
from bs4 import BeautifulSoup
import csv
# 打开HTML文件并用BeautifulSoup解析
with open('天气预报.html', 'r', encoding='utf-8') as f:
soup = BeautifulSoup(f.read(), 'lxml')
# 使用CSS选择器选取所有表格行
rows = soup.select('div.hanml tr')
# 创建一个CSV文件并准备写入数据
with open('output.csv', mode='w', newline='', encoding='gbk') as csvfile:
csvwriter = csv.writer(csvfile)
# 遍历每个表格行
for row in rows:
# 查找行中的所有单元格并过滤掉含有 rowsPan 类的 <td> 元素
cells = row.select('td')
# 构建一个空列表 row_data 用于存储单元格文本内容
row_data = []
# 遍历每个单元格
for cell in cells:
# 获取单元格的文本内容,并去除首尾空白字符
cell_text = cell.get_text(strip=True)
# 将单元格文本内容添加到 row_data 列表中
row_data.append(cell_text)
# 将 row_data 列表写入CSV文件的一行
csvwriter.writerow(row_data)
把表格存储成为字典格式的代码:
这是员工工资表的.html的代码
查看代码
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>员工工资信息</title>
<style>
table {
border-collapse: collapse;
width: 100%;
}
th, td {
border: 1px solid #ddd;
padding: 8px;
text-align: left;
}
th {
background-color: #f2f2f2;
}
</style>
</head>
<body>
<h2>员工工资信息</h2>
<table>
<thead>
<tr>
<th>姓名</th>
<th>基本工资</th>
<th>岗位工资</th>
<th>绩效奖金</th>
<th>请假扣款</th>
<th>医疗社保扣款</th>
<th>总工资</th>
</tr>
</thead>
<tbody>
<tr>
<td>张三</td>
<td>6000</td>
<td>3000</td>
<td>1500</td>
<td>300</td>
<td>500</td>
<td>11700</td>
</tr>
<tr>
<td>李四</td>
<td>5000</td>
<td>2000</td>
<td>1000</td>
<td>0</td>
<td>500</td>
<td>8500</td>
</tr>
<tr>
<td>王武</td>
<td>3500</td>
<td>1500</td>
<td>800</td>
<td>0</td>
<td>0</td>
<td>5800</td>
</tr>
<tr>
<td>刘能</td>
<td>5000</td>
<td>1200</td>
<td>120</td>
<td>0</td>
<td>0</td>
<td>6320</td>
</tr>
<tr>
<td>王二</td>
<td>5000</td>
<td>1200</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>6200</td>
</tr>
<tr>
<td>王杰噶</td>
<td>3500</td>
<td>1500</td>
<td>800</td>
<td>0</td>
<td>500</td>
<td>5800</td>
</tr>
<tr>
<td>刘冰</td>
<td>700</td>
<td>800</td>
<td>800</td>
<td>800</td>
<td>800</td>
<td>2300</td>
</tr>
<tr>
<td>刘星宇</td>
<td>5000</td>
<td>6000</td>
<td>900</td>
<td>800</td>
<td>500</td>
<td>12600</td>
</tr>
<tr>
<td>王丹</td>
<td>3500</td>
<td>1500</td>
<td>800</td>
<td>120</td>
<td>500</td>
<td>5180</td>
</tr>
</tbody>
</table>
</body>
</html>
我们可以看到代码中,首行<tr>里是自定义头部<th>,剩下的<tr>里,都是数据<td>
因此我们的操作方式,就是把<th>的数据变成字典的{key},把<td>的值变成字典里的{value},让字典的格式写成:{'姓名': '张三', '基本工资': '6000', '岗位工资': '3000',……}
并最终汇总为列表:
[{'姓名': '张三', '基本工资': '6000', '岗位工资': '3000', '绩效奖金': '1500', '请假扣款': '300', '医疗社保扣款': '500', '总工资': '11700'},
{'姓名': '李四', '基本工资': '5000', '岗位工资': '2000', '绩效奖金': '1000', '请假扣款': '0', '医疗社保扣款': '500', '总工资': '8500'},
{'姓名': '王武', '基本工资': '3500', '岗位工资': '1500', '绩效奖金': '800', '请假扣款': '0', '医疗社保扣款': '0', '总工资': '5800'},……]
以下是实现代码:
from bs4 import BeautifulSoup
# 打开HTML文件并用BeautifulSoup解析
with open('./工资表导出excel.html', 'r', encoding='utf-8') as f:
soup = BeautifulSoup(f.read(), 'lxml')
# 提取表格数据
table = soup.find('table')
rows = table.find_all('tr')
# 提取表头
headers = []
header_cells = rows[0].find_all('th')
for header_cell in header_cells:
headers.append(header_cell.text.strip())
# 提取表格数据并创建字典列表
list_data = []
for row in rows[1:]:
dic = {}
data_cells = row.find_all('td')
for i in range(len(headers)):
dic[headers[i]] = data_cells[i].text.strip()
list_data.append(dic)
# 打印字典列表
# print(list_data)
for li in list_data:
print(li)
如果你想把得到的list_data
存储为csv,可以这样操作
import csv
from bs4 import BeautifulSoup
# 打开HTML文件并用BeautifulSoup解析
with open('./工资表导出excel.html', 'r', encoding='utf-8') as f:
soup = BeautifulSoup(f.read(), 'lxml')
# 提取表格数据
table = soup.find('table')
rows = table.find_all('tr')
# 提取表头
headers = []
header_cells = rows[0].find_all('th')
for header_cell in header_cells:
headers.append(header_cell.text.strip())
# 提取表格数据并创建字典列表
list_data = []
for row in rows[1:]:
dic = {}
data_cells = row.find_all('td')
for i in range(len(headers)):
dic[headers[i]] = data_cells[i].text.strip()
list_data.append(dic)
# CSV文件路径
csv_file_path = '导出工资表.csv'
# 写入CSV文件
with open(csv_file_path, 'w', newline='', encoding='gbk') as csv_file:
# 创建CSV写入对象
csv_writer = csv.DictWriter(csv_file, fieldnames=list_data[0].keys())
# 写入表头
csv_writer.writeheader()
# 写入数据
csv_writer.writerows(list_data)
print(f'CSV文件已创建:{csv_file_path}')
把表格存储成为列表格式的代码:
import csv
from bs4 import BeautifulSoup
# 打开HTML文件并用BeautifulSoup解析
with open('./工资表导出excel.html', 'r', encoding='utf-8') as f:
soup = BeautifulSoup(f.read(), 'lxml')
# 提取表格数据
table = soup.find('table')
rows = table.find_all('td')
# print(rows)
data_list = []
for row in rows:
data_list.append(row.text.strip())
# 切片,每7个元素为一行
data_rows = []
for i in range(0, len(data_list), 7):
data_row = data_list[i:i+7]
data_rows.append(data_row)
# CSV文件路径
csv_file_path = '工资列表.csv'
# 写入CSV文件
with open(csv_file_path, 'w', newline='', encoding='gbk') as csv_file:
csv_writer = csv.writer(csv_file)
# 写入表头
csv_writer.writerow(["姓名", "基本工资", "岗位工资", "绩效奖金", "请假扣款", "医疗社保扣款", "总工资"])
# 写入内容
csv_writer.writerows(data_rows)
print(f'CSV文件已创建:{csv_file_path}')