You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用BeautifulSoup将HTML表格转为JSON时格式错误,求解决方法

如何用BeautifulSoup将HTML表格转换为指定格式的JSON

我正在尝试使用Python的BeautifulSoup函数将HTML表格转换为JSON,已实现转换但输出的JSON格式不符合预期。

原代码

from bs4 import BeautifulSoup
import json

reading_table = """\
<table>
<tbody>
<tr>
<td><span class="customlabel">Energy Source</span></td>
<td><span class="custominput">EB</span></td>
<td><span class="customlabel">Grid Reading </span></td>
<td><span class="custominput">2666.2</span></td>
<td><span class="customlabel">DG Reading </span></td>
<td><span class="custominput">15.5</span></td>
</tr>
<tr>
<td><span class="customlabel">Power Factor</span></td>
<td><span class="custominput">0.844</span></td>
<td><span class="customlabel">Total Kw</span></td>
<td><span class="custominput">0.273</span></td>
<td><span class="customlabel">Total KVA</span></td>
<td><span class="custominput">0.34</span></td>
</tr>
<tr>
<td><span class="customlabel">Average Voltage</span></td>
<td><span class="custominput">241.7</span></td>
<td><span class="customlabel">Total Current</span></td>
<td><span class="custominput">1.54</span></td>
<td><span class="customlabel">Frequency Hz</span></td>
<td><span class="custominput">50</span></td>
</tr>
</tbody>
</table>
"""

reading_table_data = [
    [cell.text for cell in row("td")]
    for row in BeautifulSoup(reading_table, features="html.parser")("tr")
]

print(reading_table_data)

当前输出

[['Energy Source', 'EB', 'Grid Reading ', '2666.2', 'DG Reading ', '15.5'], ['Power Factor', '0.844', 'Total Kw', '0.273', 'Total KVA', '0.34'], ['Average Voltage', '241.7', 'Total Current', '1.54', 'Frequency Hz', '50']]

期望输出

{
  "Energy Source": "EB",
  "Grid Reading ": "2666.2",
  "DG Reading ": "15.5",
  "Power Factor": "0.844",
  "Total Kw": "0.273",
  "Total KVA": "0.34",
  "Average Voltage": "241.7",
  "Total Current": "1.54",
  "Frequency Hz": "50"
}

解决方案

将二维列表转换成键值对字典,再输出格式化的JSON即可。修改后的代码如下:

from bs4 import BeautifulSoup
import json

reading_table = """\
<table>
<tbody>
<tr>
<td><span class="customlabel">Energy Source</span></td>
<td><span class="custominput">EB</span></td>
<td><span class="customlabel">Grid Reading </span></td>
<td><span class="custominput">2666.2</span></td>
<td><span class="customlabel">DG Reading </span></td>
<td><span class="custominput">15.5</span></td>
</tr>
<tr>
<td><span class="customlabel">Power Factor</span></td>
<td><span class="custominput">0.844</span></td>
<td><span class="customlabel">Total Kw</span></td>
<td><span class="custominput">0.273</span></td>
<td><span class="customlabel">Total KVA</span></td>
<td><span class="custominput">0.34</span></td>
</tr>
<tr>
<td><span class="customlabel">Average Voltage</span></td>
<td><span class="custominput">241.7</span></td>
<td><span class="customlabel">Total Current</span></td>
<td><span class="custominput">1.54</span></td>
<td><span class="customlabel">Frequency Hz</span></td>
<td><span class="custominput">50</span></td>
</tr>
</tbody>
</table>
"""

# 解析表格获取每行的单元格文本
soup = BeautifulSoup(reading_table, features="html.parser")
reading_table_data = [
    [cell.text for cell in row("td")]
    for row in soup("tr")
]

# 转换为键值对字典
result_dict = {}
for row_cells in reading_table_data:
    # 每两个单元格一组,第一个是键,第二个是值
    for i in range(0, len(row_cells), 2):
        key = row_cells[i]
        value = row_cells[i+1]
        result_dict[key] = value

# 输出格式化的JSON
print(json.dumps(result_dict, indent=2))

思路说明

  1. 保留原有的HTML解析逻辑,获取每行的单元格文本列表。
  2. 初始化空字典,遍历每行的单元格列表,按步长2遍历,将第i个单元格作为键、第i+1个作为值存入字典。
  3. 使用json.dumps()并设置indent=2,输出格式化后的JSON字符串,匹配期望格式。

内容的提问来源于stack exchange,提问作者Rahul Sharma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 01:50:38