使用Beautiful Soup过滤<p>标签子类 排除嵌套p标签抓取目标正文
问题解决方法
方法1:使用recursive参数限制仅查找直接子元素
你当前的代码会抓取所有后代p标签的核心原因是find_all方法默认开启递归查找,会遍历目标节点下所有层级的子节点。你只需要给find_all添加recursive=False参数,就只会抓取id="storytext"的直接子p标签,自动跳过嵌套在子div里的p标签,适配你当前的需求场景。
修改后的代码如下:
story_text = soup.find('div', {'id':'storytext'}) # 添加recursive=False参数,仅查找当前节点的直接子元素 paragraphs = story_text.find_all('p', recursive=False) for p in paragraphs: story.append(p.text)
方法2:显式过滤不需要的子容器内的p标签
如果后续你还有其他层级的p标签需要保留,只想排除class="imagewrap"下的p,可以先移除该容器再查找目标内容:
story_text = soup.find('div', {'id':'storytext'}) # 先删除不需要的imagewrap节点 story_text.find('div', {'class':'imagewrap'}).decompose() # 再查找所有p标签即可过滤掉嵌套内容 paragraphs = story_text.find_all('p') for p in paragraphs: story.append(p.text)
内容的提问来源于stack exchange,提问作者megansorel
相关产品推荐
相关产品推荐

