如何在BeautifulSoup中获取选中标签的下一个元素(含无标识场景)
关于BeautifulSoup获取相邻元素的问题解答
1. 如何在BeautifulSoup中获取选中标签的下一个标签(元素)?
首先得搞清楚BeautifulSoup里next_sibling和next_element的区别——这也是你之前拿到换行符或文本内容的核心原因:
next_element会直接跳到当前元素之后的第一个节点,包括文本节点(比如HTML里的换行、空格)next_sibling找的是当前元素的同级兄弟节点,但同样可能碰到空白文本节点
要精准拿到下一个标签元素,有几个实用方法:
find_next_sibling():自动跳过空白文本,直接返回同级的下一个标签元素- 连续调用
next_sibling两次(如果中间只有一个空白节点的话) find_next():可以指定目标标签名,精准定位
举个简单示例:
# 假设soup是你的BeautifulSoup实例 target_tag = soup.find('span', class_='class1') # 方法1:最稳妥的方式 next_tag = target_tag.find_next_sibling() # 方法2:指定标签名更精准 next_tag = target_tag.find_next('p') # 方法3:确定中间只有空白节点时可用 next_tag = target_tag.next_sibling.next_sibling
2. 选中上层标签后,如何获取它的下一个元素(针对你给出的HTML结构)
你的目标HTML结构是:
<div> <span class="class1"> text </span> <p> I want this text </p> </div>
你已经能选中<span class="class1">,现在要拿到后面<p>标签里的文本,直接用上面的方法就能解决,修正后的完整代码如下:
from bs4 import BeautifulSoup data = BeautifulSoup(""" <div> <span class="class1"> text </span> <p> I want this text </p> </div> """, 'lxml') # 方法1:找到同级下一个标签后取文本 desired_text = data.find('span', class_='class1').find_next_sibling().get_text(strip=True) # 方法2:直接定位下一个p标签 desired_text = data.find('span', class_='class1').find_next('p').get_text(strip=True) # 方法3:跳过空白节点的方式 desired_text = data.find('span', class_='class1').next_sibling.next_sibling.get_text(strip=True) print(desired_text) # 输出:I want this text
为什么你之前的代码没拿到预期结果?
- 调用
next_sibling时,首先碰到的是<span>标签后面的换行空白节点,所以返回'\n' next_element会先跳到<span>内部的文本节点(就是text那部分),所以返回的是' text '
另外推荐用get_text(strip=True)获取文本,它会自动去掉前后的空白和换行,让结果更干净。
内容的提问来源于stack exchange,提问作者MohitGhodasara
相关产品推荐
相关产品推荐

