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

使用BeautifulSoup将多行HTML表格转换为字典列表

问题:将指定HTML表格转换为字典列表

需要解析包含Runtime end of support dates的HTML表格,将其转换为字典列表,每个字典对应表格的一行,键为表头名称,值为对应单元格的文本内容。

完善后的代码

from bs4 import BeautifulSoup
import pprint

# 假设html_content是你提供的HTML代码字符串
html_content = """<div class="table-container"><table><thead><tr><th class="table-header" colspan="100%"><div class="title">Runtime end of support dates</div></th></tr>
      <tr>
        <th>Name</th>
        <th>Identifier</th>
        <th>Operating system</th>
        <th>Deprecation Phase 1</th>
        <th>Deprecation Phase 2</th>
      </tr>
    </thead>
      <tr>
        <td>
          <p>.NET Core 3.1</p>
        </td>
        <td>
          <p><code class="code">dotnetcore3.1</code></p>
        </td>
        <td>
          <p>Amazon Linux 2</p>
        </td>
        <td>
          <p>Jan 20, 2023</p>
        </td>
        <td>
          <p>Feb 20, 2023</p>
        </td>
      </tr>
      <tr>
        <td>
          <p>Node.js 12</p>
        </td>
        <td>
          <p><code class="code">nodejs12.x</code></p>
        </td>
        <td>
          <p>Amazon Linux 2</p>
        </td>
        <td>
          <p>Nov 14, 2022</p>
        </td>
        <td>
          <p>Dec 14, 2022</p>
        </td>
      </tr> 
      <tr>
        <td>
          <p>.NET Core 2.1</p>
        </td>
        <td>
          <p><code class="code">dotnetcore2.1</code></p>
        </td>
        <td>
          <p>Amazon Linux</p>
        </td>
        <td>
          <p>Jan 5, 2022</p>
        </td>
        <td>
          <p>Apr 13, 2022</p>
        </td>
      </tr>
      <tr>
        <td>
          <p>Python 3.6</p>
        </td>
        <td>
          <p><code class="code">python3.6</code></p>
        </td>
        <td>
          <p>Amazon Linux</p>
        </td>
        <td>
          <p>July 18, 2022</p>
        </td>
        <td>
          <p>Aug 29, 2022</p>
        </td>
      </tr>
      <tr>
        <td>
          <p>Python 2.7</p>
        </td>
        <td>
          <p><code class="code">python2.7</code></p>
        </td>
        <td>
          <p>Amazon Linux</p>
        </td>
        <td>
          <p>July 15, 2021</p>
        </td>
        <td>
          <p>May 30, 2022</p>
        </td>
      </tr>
      <tr>
        <td>
          <p>Ruby 2.5</p>
        </td>
        <td>
          <p><code class="code">ruby2.5</code></p>
        </td>
        <td>
          <p>Amazon Linux</p>
        </td>
        <td>
          <p>July 30, 2021</p>
        </td>
        <td>
          <p>March 31, 2022</p>
        </td>
      </tr>
      <tr>
        <td>
          <p>Node.js 10.x</p>
        </td>
        <td>
          <p><code class="code">nodejs10.x</code></p>
        </td>
        <td>
          <p>Amazon Linux 2</p>
        </td>
        <td>
          <p>July 30, 2021</p>
        </td>
        <td>
          <p>Feb 14, 2022</p>
        </td>
      </tr>
      <tr>
        <td>
          <p>Node.js 8.10</p>
        </td>
        <td>
          <p><code class="code">nodejs8.10</code></p>
        </td>
        <td>
          <p>Amazon Linux</p>
        </td>
        <td>
          <p> </p>
        </td>
        <td>
          <p>March 6, 2020</p>
        </td>
      </tr>
      <tr>
        <td>
          <p>Node.js 6.10</p>
        </td>
        <td>
          <p><code class="code">nodejs6.10</code></p>
        </td>
        <td>
          <p>Amazon Linux</p>
        </td>
        <td>
          <p> </p>
        </td>
        <td>
          <p>August 12, 2019</p>
        </td>
      </tr> 
      <tr>
        <td>
          <p>Node.js 4.3 edge</p>
        </td>
        <td>
          <p><code class="code">nodejs4.3-edge</code></p>
        </td>
        <td>
          <p>Amazon Linux</p>
        </td>
        <td>
          <p> </p>
        </td>
        <td>
          <p>April 30, 2019</p>
        </td>
      </tr>
      <tr> 
        <td>
          <p>Node.js 4.3</p>
        </td>
        <td>
          <p><code class="code">nodejs4.3</code></p>
        </td>
        <td>
          <p>Amazon Linux</p>
        </td>
        <td>
          <p> </p>
        </td>
        <td>
          <p>March 6, 2020</p>
        </td>
      </tr>
      <tr>
        <td>
          <p>Node.js 0.10</p>
        </td>
        <td>
          <p><code class="code">nodejs</code></p>
        </td>
        <td>
          <p>Amazon Linux</p>
        </td>
        <td>
          <p> </p>
        </td>
        <td>
          <p>October 31, 2016</p>
        </td>
      </tr>
      <tr>
        <td>
          <p>.NET Core 2.0</p>
        </td>
        <td>
          <p><code class="code">dotnetcore2.0</code></p>
        </td>
        <td>
          <p>Amazon Linux</p>
        </td>
        <td>
          <p> </p>
        </td>
        <td>
          <p>May 30, 2019</p>
        </td>
      </tr>
      <tr>
        <td>
          <p>.NET Core 1.0</p>
        </td>
        <td>
          <p><code class="code">dotnetcore1.0</code></p>
        </td>
        <td>
          <p>Amazon Linux</p>
        </td>
        <td>
          <p> </p>
        </td>
        <td>
          <p>July 30, 2019</p>
        </td>
      </tr>
      </table></div>"""

soup = BeautifulSoup(html_content, 'html.parser')
headers = []
result = []

tables = soup.find_all("div", class_="table-container")
for table in tables:
    # 定位目标表格
    if table.find(text="Runtime end of support dates"):
        rows = table.find_all("tr")
        # 提取表头:跳过带colspan的标题行,取真正的表头行
        for row in rows:
            th_list = row.find_all("th", class_=None)
            if th_list:
                headers = [th.get_text(strip=True) for th in th_list]
                break  # 找到表头后退出循环
        # 处理数据行
        for row in rows:
            td_list = row.find_all("td")
            if td_list:
                # 提取每个单元格的文本,处理空值
                row_data = [td.get_text(strip=True) for td in td_list]
                # 构建字典并添加到结果列表
                result.append(dict(zip(headers, row_data)))

# 打印结果
pprint.pprint(result)

代码改进说明

  • 初始化BeautifulSoup:补充了解析HTML的核心步骤,生成解析实例以遍历DOM结构。
  • 准确提取表头:跳过包含colspan="100%"的标题行,仅提取真正的表头列,保证表头列表的正确性。
  • 处理单元格内容:使用get_text(strip=True)提取文本并自动去除首尾空白,解决了空单元格(仅含空格)的处理问题。
  • 构建字典列表:通过zip(headers, row_data)将表头与每行数据配对,生成对应字典并收集到结果列表中。

内容的提问来源于stack exchange,提问作者Ken J

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 19:54:25