如何用BeautifulSoup解析非嵌套div结构的HTML为DataFrame
问题:解析无层级结构HTML生成工人工时DataFrame
需求与背景
需要将JavaScript生成的无嵌套结构HTML解析为DataFrame,数据按工作区分类工人及工时信息,使用BeautifulSoup处理,无法直接关联工人与所属工作区(div无嵌套层级)。
简化示例HTML
<html> <body> <div class="workarea">construction </div> <div class="name">Anna </div> <div class="Muell">w23f84md2o </div> <div class="time">8:23 </div> <div class="name">Tom </div> <div class="Muell">w23f84md2o </div> <div class="time">10:20 </div> <div class="workarea">cleaning </div> <div class="name">Max </div> <div class="Muell">w23f84md2o </div> <div class="time">9:30 </div> </body> </html>
期望输出DataFrame
| WORKAREA | NAME | TIME |
|---|---|---|
| construction | Anna | 8:23 |
| construction | Tom | 10:20 |
| cleaning | Max | 9:30 |
尝试代码
# read html with bs4 with open("testdoc1.html") as fp: soup=BeautifulSoup(fp,"html.parser") wa = soup.find_all("div",class="workarea") # here I wanted to add a for loop through wa, but wa doesnt actually contain the info
遇到的问题
无法通过遍历workarea标签获取对应工人信息,因为这类标签仅包含工作区名称,未嵌套下属工人数据。希望按文档顺序解析div,筛选出workarea、name、time类的div并保留原有顺序,实现工作区与工人的关联。
解决方案
核心思路是按文档顺序遍历目标div,维护当前工作区上下文,将后续的name和time与当前工作区关联,最终整理成DataFrame。
完整代码
from bs4 import BeautifulSoup import pandas as pd # 加载HTML文档 with open("testdoc1.html") as fp: soup = BeautifulSoup(fp, "html.parser") # 筛选出需要的div:按文档顺序获取class为workarea、name、time的标签 target_divs = soup.find_all("div", class_=["workarea", "name", "time"]) current_workarea = None worker_info = {} result_list = [] for div in target_divs: # 更新当前工作区 if "workarea" in div.get("class"): current_workarea = div.get_text(strip=True) # 记录工人姓名,绑定当前工作区 elif "name" in div.get("class"): worker_info["WORKAREA"] = current_workarea worker_info["NAME"] = div.get_text(strip=True) # 记录工时,完成一组数据收集后存入结果列表 elif "time" in div.get("class"): worker_info["TIME"] = div.get_text(strip=True) result_list.append(worker_info.copy()) worker_info.clear() # 转换为DataFrame df = pd.DataFrame(result_list) print(df)
代码说明
- 筛选目标div:使用
find_all的class_参数传入列表,一次性获取所有需要的div,且严格保留文档中的出现顺序。 - 维护上下文:用
current_workarea变量记录当前所在的工作区,遇到新的workarea标签时更新该变量。 - 收集数据:遇到
name时初始化工人信息字典并绑定当前工作区,遇到time时补充工时信息,将完整的字典存入结果列表,避免后续数据覆盖。 - 生成DataFrame:将结果列表直接传入
pd.DataFrame(),自动生成符合要求的表格结构。
该方法高效处理大量div(数千级),无需逐行读取,完全基于BeautifulSoup的解析能力实现。
内容的提问来源于stack exchange,提问作者tailor
相关产品推荐
相关产品推荐

