BeautifulSoup中通过.div链式调用时能否加索引或属性筛选获取目标标签
你给出的两种写法都无法拿到目标元素,原因和正确方案如下:
错误写法说明
- 第一种
item.a.div.div.div.div[2]:
bs4中Tag对象使用[索引/属性名]语法时,是用于获取标签的属性值,而非子节点。你链式调用最后得到的是class为_1cRBf1的div标签,对它使用[2]相当于查找该标签有没有名为2的属性,完全无法匹配到子元素。 - 第二种
item.a.div.div.div.div[class="_3VombQ"]:
该写法不符合Python基础语法,方括号内不支持直接写key=value的表达式,运行会直接抛出语法错误,不可能实现筛选功能。
正确实现方式
方式1:按子节点顺序获取
如果你确定要取当前atag下的第二个div元素(bs4节点索引从0开始计数,所以目标索引为1),可以用find_all先拿到所有子div再索引:
atag = item.a.div.div.div.div target_div = atag.find_all('div')[1]
如果仅需要匹配直接子div、忽略更深层级的嵌套div,可以加recursive=False参数:
target_div = atag.find_all('div', recursive=False)[1]
方式2:按class属性筛选
更稳妥的方式是直接通过class属性匹配目标元素,避免后续页面结构调整、节点顺序变化导致的取值错误。注意class是Python保留关键字,所以bs4的查询参数要写为class_:
atag = item.a.div.div.div.div target_div = atag.find('div', class_='_3VombQ')
内容的提问来源于stack exchange,提问作者DHK
相关产品推荐
相关产品推荐

