如何反转BeautifulSoup的find_all()结果?移除末尾空p标签
反转BeautifulSoup find_all()结果顺序并移除末尾空p标签
实现思路
要达成你的需求,可以分两步操作:
- 先把
find_all()返回的元素列表反转,这样就能从原文档的末尾开始检查内容 - 遍历反转后的列表,过滤掉开头的空p标签(对应原文档末尾的空p标签),直到碰到非空标签,最后再把剩余元素反转回原顺序
空p标签的判断标准
一个p标签算作空标签,是指它的文本内容去除首尾空白后无有效内容,代码判断逻辑为:element.name == 'p' and not element.text.strip()
完整代码示例
from bs4 import BeautifulSoup soupcleanup = BeautifulSoup(contentsinputphp, 'html5lib') elements = soupcleanup.find_all() # 反转列表,从原文档末尾开始处理 reversed_elements = elements[::-1] filtered_list = [] for elem in reversed_elements: # 遇到非p标签或非空p标签时,停止过滤并收集剩余所有元素 if elem.name != 'p' or elem.text.strip(): filtered_list.append(elem) filtered_list.extend(reversed_elements[reversed_elements.index(elem)+1:]) break # 将过滤后的列表反转回原顺序 final_elements = filtered_list[::-1] # 输出处理后的结果 for element in final_elements: print("###", element, "###")
更高效的实现方式
如果不想多次反转列表,也可以直接从原列表末尾往前遍历,定位到需要保留的最后一个元素的位置:
from bs4 import BeautifulSoup soupcleanup = BeautifulSoup(contentsinputphp, 'html5lib') elements = soupcleanup.find_all() # 从后往前遍历,找到第一个非空p标签的位置 keep_until = len(elements) for i in range(len(elements)-1, -1, -1): current_elem = elements[i] # 若是空p标签,标记截断位置 if current_elem.name == 'p' and not current_elem.text.strip(): keep_until = i else: # 遇到非空标签,停止遍历 break # 截取需要保留的元素部分 final_elements = elements[:keep_until] # 输出结果 for element in final_elements: print("###", element, "###")
内容的提问来源于stack exchange,提问作者user304539
相关产品推荐
相关产品推荐

