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

如何在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))

代码说明

  1. HTML解析:通过BeautifulSoup定位目标表格,提取所有行的键值对数据。
  2. 表头生成:按key首次出现的顺序去重,得到标准表格的属性列标题。
  3. 实体分组转换:根据表头长度确定每组实体的行数,将每组键值对转换为一行单元格,确保值的顺序与表头对应。
  4. 内容替换:用新生成的表头和实体行替换原表格的对应部分,输出最终HTML。

内容的提问来源于stack exchange,提问作者krishna raja

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 13:16:18