BeautifulSoup提取内容时如何忽略嵌套标签内的文本?
解决方法
你原来的代码用.text会提取当前节点所有子孙节点的文本内容,所以会把嵌套span里的文本也一起拿出来。要只拿p标签本身的文本,只需要提取p标签的直接文本子节点即可,两种常用实现方案如下:
方案1:筛选直接文本子节点(不修改原DOM结构)
直接遍历p标签的contents属性,只保留属于文本类型的子节点,拼接后即可得到p标签本身的内容,不会改变原有soup的结构。
from bs4 import BeautifulSoup, NavigableString # 前面的soup初始化逻辑保持不变 for price in soup.find_all('p', attrs={'class': 'price'}): # 过滤出直接文本子节点,拼接后去除首尾空白 main_price = ''.join([content.strip() for content in price.contents if isinstance(content, NavigableString)]) print(main_price)
方案2:先移除嵌套的span标签(适合需清理多个嵌套标签的场景)
先把p标签内部所有不需要的span节点从DOM中移除,再取text就是p本身的文本,该方案会修改原soup中对应节点的结构,适合后续不需要复用原有节点的场景。
for price in soup.find_all('p', attrs={'class': 'price'}): # 移除p标签内所有span节点 for unwanted_span in price.find_all('span'): unwanted_span.extract() print(price.text.strip())
内容的提问来源于stack exchange,提问作者Darkstar
相关产品推荐
相关产品推荐

