如何使用BeautifulSoup从HTML中提取指定div分区内容
问题原因
两个查询语句返回空,分别对应写法错误和源文件问题两类:
- 第一条
tags查询逻辑完全错误:findAll的text参数(4.4.0版本后改名为string)作用是匹配标签包裹的可见文本内容,你传入的是div标签的HTML代码,这段代码属于标签声明,不是页面渲染后显示的文本,不可能被匹配到。 - 第二条
Bedeutungen查询的语法逻辑是对的,返回空的核心原因大概率是本地保存的HTML文件不完整:你在浏览器开发者工具里看到的1042行标签,是浏览器执行JS后渲染出的最终DOM结构,如果你右键另存时选了「仅HTML」类型,很多动态加载的内容块不会被保存到本地静态文件里,自然搜不到对应节点。 - 额外冗余问题:代码里导入的
requests、pandas、urllib.request三个库在读取本地文件的场景下完全没用到,属于无效导入。
修复步骤
- 先校验本地文件完整性
运行下面的代码,确认目标节点确实存在于你保存的本地文件中,不要直接以浏览器里看到的行号为准:
如果返回with open("aufmachen.html", "r", encoding="utf8") as f: raw_html = f.read() print("目标id是否存在:", "bedeutungen" in raw_html)False,重新保存页面:等词条页所有内容加载完成后,右键另存时选择「网页,全部」类型,或者直接在开发者工具的元素面板找到id为bedeutungen的div节点,复制其外部HTML单独保存,避免动态内容缺失。 - 修正解析代码
id是HTML全局唯一属性,直接用id参数匹配即可,不需要额外匹配class,也不需要限定在body下查找,修复后的可运行代码如下:from bs4 import BeautifulSoup with open("aufmachen.html", "r", encoding="utf8") as f: soup = BeautifulSoup(f, "html.parser") # 查找唯一的释义板块节点 bedeutung_section = soup.find("div", id="bedeutungen") if bedeutung_section: # 提取板块下所有释义条目(杜登词典的释义均存放在class为enumeration__item的li标签下) bedeutung_items = [entry.get_text(strip=True) for entry in bedeutung_section.select("li.enumeration__item")] for idx, item in enumerate(bedeutung_items, 1): print(f"释义{idx}:{item}") else: print("未匹配到释义板块,请检查本地HTML文件完整性")
补充说明
- 新版BeautifulSoup推荐使用蛇形命名的
find_all替代旧版本驼峰命名的findAll,查找唯一节点时用find()即可,性能比查找全部节点更高。 - 不要尝试用
text/string参数匹配标签代码,该参数仅对标签内的可见文本生效。
内容的提问来源于stack exchange,提问作者neptuniumm
相关产品推荐
相关产品推荐

