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

如何用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

WORKAREANAMETIME
constructionAnna8:23
constructionTom10:20
cleaningMax9: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)

代码说明

  1. 筛选目标div:使用find_all的class_参数传入列表,一次性获取所有需要的div,且严格保留文档中的出现顺序。
  2. 维护上下文:用current_workarea变量记录当前所在的工作区,遇到新的workarea标签时更新该变量。
  3. 收集数据:遇到name时初始化工人信息字典并绑定当前工作区,遇到time时补充工时信息,将完整的字典存入结果列表,避免后续数据覆盖。
  4. 生成DataFrame:将结果列表直接传入pd.DataFrame(),自动生成符合要求的表格结构。

该方法高效处理大量div(数千级),无需逐行读取,完全基于BeautifulSoup的解析能力实现。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 17:01:14