使用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))
思路说明
- 保留原有的HTML解析逻辑,获取每行的单元格文本列表。
- 初始化空字典,遍历每行的单元格列表,按步长2遍历,将第i个单元格作为键、第i+1个作为值存入字典。
- 使用
json.dumps()并设置indent=2,输出格式化后的JSON字符串,匹配期望格式。
内容的提问来源于stack exchange,提问作者Rahul Sharma
相关产品推荐
相关产品推荐

