如何用BeautifulSoup提取新闻文章正文,排除冗余内容?
几种简便方法帮你用BeautifulSoup提取干净的新闻正文
嘿,这个问题我太熟悉了——用BeautifulSoup抓新闻正文的时候,那些乱七八糟的脚本、侧边栏广告、导航栏内容真的烦死人!我踩过不少坑,总结了几个实用的方法,能帮你快速过滤掉冗余内容,只留下纯正文:
方法1:利用语义化HTML标签精准定位
正规新闻网站大多会用<article>标签包裹完整的新闻内容,或者用<div>配合特定类名来定义正文区域。先定位到这个核心容器,再提取里面的段落,就能避开大部分冗余:
from bs4 import BeautifulSoup import requests # 替换成你要抓取的新闻URL target_url = "https://example.com/news-article" response = requests.get(target_url) soup = BeautifulSoup(response.text, 'html.parser') # 第一步:定位文章核心容器,优先找<article>标签 article_box = soup.find('article') if not article_box: # 如果没有article标签,试试找常见的正文类名,比如article-content、post-body article_box = soup.find('div', class_=['article-content', 'post-body', 'main-content']) if article_box: # 第二步:提取容器内所有<p>标签的文本,过滤空内容 clean_paragraphs = [p.get_text(strip=True) for p in article_box.find_all('p') if p.get_text(strip=True)] # 拼接成完整的正文 full_article_text = '\n\n'.join(clean_paragraphs) print(full_article_text) else: print("没找到合适的正文容器,可能需要调整选择器哦!")
方法2:直接移除所有脚本、样式等冗余标签
你提到的那种JS代码都在<script>标签里,还有<style>、<noscript>这些标签里的内容也完全没用,直接把它们从DOM树里删掉,再提取文本就清爽多了:
# 先移除所有不需要的标签 for unwanted_tag in soup(["script", "style", "noscript", "nav", "aside", "footer"]): unwanted_tag.decompose() # 提取所有正文相关标签的文本(比如p、h1-h3,根据需求调整) text_elements = soup.find_all(['p', 'h1', 'h2', 'h3']) clean_text = '\n\n'.join([elem.get_text(strip=True) for elem in text_elements if elem.get_text(strip=True)]) print(clean_text)
这里我还加了nav、aside、footer这些标签,它们一般是导航、侧边栏、页脚,直接删掉能进一步减少冗余。
小技巧:处理顽固的冗余文本
如果还是有零星的无关内容(比如某个带广告的p标签),可以通过判断文本长度或者关键词来过滤:
# 只保留长度超过20个字符的段落,过滤掉短的广告/提示文本 clean_paragraphs = [p.get_text(strip=True) for p in article_box.find_all('p') if len(p.get_text(strip=True)) > 20]
另外,如果遇到动态加载的内容(比如滚动才加载的段落),BeautifulSoup就搞不定了,这时候可能需要配合Selenium或者Playwright来渲染页面,但如果是静态页面,上面的方法足够用啦!
内容的提问来源于stack exchange,提问作者user3473269
相关产品推荐
相关产品推荐

