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}')

 

posted @ 2024-01-04 21:14  Magiclala  阅读(102)  评论(0编辑  收藏  举报