如何使用BeautifulSoup按类名查找标签的指定父元素
问题原因
返回None的核心原因有两点:
- 第二种写法的参数名错误:BeautifulSoup中指定class的关键字参数为
class_(下划线位于class关键字后方),你写的_class是无效参数,不会被识别为class筛选条件。 - 第一种字典传参的写法逻辑本身正确,返回None通常是因为定位到的
char_title节点不符合预期:如果目标文本前后存在换行、缩进空格、零宽字符等不可见内容,精确字符串匹配可能命中DOM树其他位置的同文本节点,该节点不存在class为TableContainer的父级div,自然返回None。
正确实现代码
先通过class+文本包含匹配的方式稳妥定位标题节点,再向上查找指定父元素,参考代码如下:
from bs4 import BeautifulSoup soup = BeautifulSoup(page.content, "html.parser") # 稳妥定位标题div,避免空白字符导致匹配错位 char_title = soup.find( "div", class_="Text", string=lambda text: text and "Character Information" in text.strip() ) # 父元素查找二选一即可 # 写法1:通过attrs字典传参筛选 parent = char_title.find_parent("div", attrs={"class": "TableContainer"}) # 写法2:通过class_关键字参数筛选 # parent = char_title.find_parent("div", class_="TableContainer") # 从父元素下提取目标表格 # 提取外层Table3表格 target_table = parent.find("table", class_="Table3") # 提取内层宽度100%的目标内容表格 # target_table = parent.find("div", class_="InnerTableContainer").find("table", style="width: 100%")
排查技巧
如果代码运行仍返回None,可以遍历当前节点的所有父节点,打印节点信息校验实际DOM结构是否和预期一致:
# 遍历所有上层父节点,输出div节点的class属性 for parent_node in char_title.parents: if parent_node.name == "div": print(parent_node.get("class"))
内容的提问来源于stack exchange,提问作者Rafa Acioly
相关产品推荐
相关产品推荐

