如何提取HTML中指定class的最内层空div之间的文本内容?
提取指定start与end之间的文本内容
核心思路
先定位到第二个带start类的空div,接着遍历它的后续兄弟节点,直到遇到第一个带end类的div为止,收集过程中所有节点的文本内容。
代码实现(以Python的BeautifulSoup为例)
from bs4 import BeautifulSoup # 假设你的HTML内容存在html变量中 html = """ many <divs> </divs> and other tags <div class ="start"> </div> <div> bla bla bla </div> <div class ="start"> </div> <div> <i> <a> <span> <p> Text I want </p></span></a></i> </div> <div> <p> Text I want </p> <p> Text I want </p> </div> <div class ="end"></div> <div> bla bla bla </div> <div class ="end"></div> many <divs> </divs> and other tags """ soup = BeautifulSoup(html, 'html.parser') # 找到所有带start类的div,取第二个(索引为1,因为列表从0开始) start_divs = soup.find_all('div', class_='start') target_start = start_divs[1] # 遍历后续兄弟节点,收集文本 result_text = [] for sibling in target_start.next_siblings: # 过滤掉换行等非标签节点 if not hasattr(sibling, 'attrs'): continue # 遇到第一个end类div就停止 if 'end' in sibling.attrs.get('class', []): break # 提取当前节点下的所有文本(包括子标签里的) result_text.append(sibling.get_text(strip=True)) # 合并结果,过滤空内容 final_text = '\n'.join([t for t in result_text if t]) print(final_text)
代码说明
find_all('div', class_='start'):一次性获取所有带start类的div,直接取第二个就能定位目标起始点。next_siblings:遍历起始div的所有后续兄弟节点,这里要过滤掉换行符这类非标签节点(HTML里的换行会被解析成NavigableString,没有attrs属性)。sibling.get_text(strip=True):提取当前节点下所有层级的文本,自动去掉首尾空格,避免空内容干扰。- 判断
'end' in sibling.attrs.get('class', []):确保遇到第一个end类div时立即停止遍历,不会多取无关内容。
你之前方法失败的可能原因
- 没过滤
next_siblings里的非标签节点,导致判断class时触发属性不存在的错误。 - 没设置终止条件,遍历了所有兄弟节点,拿到了不需要的内容。
内容的提问来源于stack exchange,提问作者Newbie
相关产品推荐
相关产品推荐

