如何在PostgreSQL中将动态表的行转换为列?
解决方案:将Key-Value结构表格转换为标准列标题表格
问题说明
输入表格采用Key-Value结构存储数据:表头固定为key和Value,<tbody>中每多行对应一个完整实体(比如2行/3行一组,每组包含该实体的所有属性键值对)。需要将这类动态输入表转换为标准表格:表头为所有属性名,<tbody>中每行对应一个完整实体。
通用处理代码(Python + BeautifulSoup)
以下代码可处理任意数量属性的此类表格,自动识别属性组并转换格式:
from bs4 import BeautifulSoup def transform_key_value_table(html_content): # 解析HTML内容 soup = BeautifulSoup(html_content, 'html.parser') target_table = soup.find('table', class_='s-table') tbody_rows = target_table.find('tbody').find_all('tr') # 提取所有键值对 key_value_list = [] for row in tbody_rows: cols = row.find_all('td') key = cols[0].text.strip() value = cols[1].text.strip() key_value_list.append((key, value)) # 生成表头(按首次出现顺序去重) headers = [] seen_keys = set() for key, _ in key_value_list: if key not in seen_keys: headers.append(key) seen_keys.add(key) group_length = len(headers) # 替换原表头 new_thead_tr = soup.new_tag('tr') for header in headers: th_tag = soup.new_tag('th') th_tag.string = header new_thead_tr.append(th_tag) target_table.find('thead').find('tr').replace_with(new_thead_tr) # 构建新tbody内容 new_tbody = soup.new_tag('tbody') # 按分组拆分键值对,转换为标准行 for i in range(0, len(key_value_list), group_length): current_group = key_value_list[i:i+group_length] new_tr = soup.new_tag('tr') # 按表头顺序填充值 for header in headers: matched_value = next(v for k, v in current_group if k == header) td_tag = soup.new_tag('td') td_tag.string = matched_value new_tr.append(td_tag) new_tbody.append(new_tr) target_table.find('tbody').replace_with(new_tbody) # 返回处理后的HTML字符串 return str(soup) # 测试输入1 input_html_1 = """ <div class="s-table-container"> <table class="s-table"> <thead> <tr> <th>key</th> <th>Value</th> </tr> </thead> <tbody> <tr> <td>Id</td> <td>1</td> </tr> <tr> <td>Name</td> <td>AAAA</td> </tr> <tr> <td>Id</td> <td>2</td> </tr> <tr> <td>Name</td> <td>BBBB</td> </tr> </tbody> </table> </div> """ print(transform_key_value_table(input_html_1)) # 测试输入2 input_html_2 = """ <div class="s-table-container"> <table class="s-table"> <thead> <tr> <th>key</th> <th>Value</th> </tr> </thead> <tbody> <tr> <td>Id</td> <td>1</td> </tr> <tr> <td>Name</td> <td>AAAA</td> </tr> <tr> <td>Dept</td> <td>IT</td> </tr> <tr> <td>Id</td> <td>2</td> </tr> <tr> <td>Name</td> <td>BBBB</td> </tr> <tr> <td>Dept</td> <td>Admin</td> </tr> </tbody> </table> </div> """ print(transform_key_value_table(input_html_2))
代码说明
- HTML解析:通过BeautifulSoup定位目标表格,提取所有行的键值对数据。
- 表头生成:按key首次出现的顺序去重,得到标准表格的属性列标题。
- 实体分组转换:根据表头长度确定每组实体的行数,将每组键值对转换为一行单元格,确保值的顺序与表头对应。
- 内容替换:用新生成的表头和实体行替换原表格的对应部分,输出最终HTML。
内容的提问来源于stack exchange,提问作者krishna raja
相关产品推荐
相关产品推荐

