如何从HTML提取数据生成以类名为键的字典 适配Selenium/BeautifulSoup场景
方案说明
该需求完全可实现,以下分别提供静态页面和动态页面两种场景的实现方案:
方案1:BeautifulSoup实现(适用静态HTML场景)
无需启动浏览器,直接解析HTML源码即可,实现代码如下:
from bs4 import BeautifulSoup from collections import defaultdict def extract_text_by_class(html_content): result = defaultdict(list) soup = BeautifulSoup(html_content, 'html.parser') # 查找所有带有class属性的元素 for element in soup.find_all(attrs={"class": True}): # 处理单个元素多个类名的情况 class_list = element.get("class") # 提取元素文本,去掉首尾空白 text = element.get_text(strip=True) for cls in class_list: # 可在此处加类名过滤规则,只保留你需要的目标类,避免存入a1这类不需要的父类 result[cls].append(text) return dict(result) # 测试用例 test_html = """ <div class="a1"> <H1 class="title">1_title</H1> <a class="text">this is a text 1</a> <a class="text">this is a text 2</a> <H2 class="title">2_title</H2> <p class="note"> this is a note</p> </div> """ print(extract_text_by_class(test_html)) # 输出符合预期:{'title': ['1_title', '2_title'], 'text': ['this is a text 1', 'this is a text 2'], 'note': ['this is a note']}(过滤a1类后)
方案2:Selenium实现(适用JS动态渲染场景)
如果页面内容是JS动态加载的,用Selenium启动浏览器加载完成后再提取即可,实现代码如下:
from collections import defaultdict from selenium import webdriver from selenium.webdriver.common.by import By def extract_text_by_class_selenium(url): result = defaultdict(list) driver = webdriver.Chrome() driver.get(url) # 等待页面加载完成,可根据页面情况调整等待时长或替换为显式等待 driver.implicitly_wait(10) # 查找所有带class属性的元素 elements = driver.find_elements(By.XPATH, '//*[@class]') for ele in elements: class_attr = ele.get_attribute('class') if not class_attr: continue # 拆分多类名 class_list = class_attr.strip().split() text = ele.text.strip() for cls in class_list: # 可在此处加类名过滤规则 result[cls].append(text) driver.quit() return dict(result)
注意事项
- 两种方案的遍历逻辑都是按DOM节点在页面的先后顺序读取,天然满足有序提取的需求
- 如果元素文本包含换行等特殊格式,可以按需调整
strip()的逻辑,保留需要的格式 - 如果存在嵌套元素文本重复提取的问题,可以限定遍历的元素层级,只提取目标层级的元素即可
内容的提问来源于stack exchange,提问作者Ram Six
相关产品推荐
相关产品推荐

