使用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
相关产品推荐
相关产品推荐

