如何用BeautifulSoup将单篇文章的文本合并为单个字符串?
解决文章段落分组问题的方案
嘿,刚学BeautifulSoup就能上手爬数据已经很棒啦!你遇到的问题其实很常见——当前代码把所有文章的<p>标签内容都平放到一个列表里,自然没法区分哪段属于哪篇文章。咱们只需要调整一下逻辑,按文章维度先收集段落,再合并存入列表就好。
修正后的代码示例
import requests from bs4 import BeautifulSoup clean_article_texts = [] # 这个列表每个元素对应一篇完整文章的文本 test_links = ["url1", "url2", "url3"] # 替换成你的测试链接 for url in test_links: try: r = requests.get(url) r.raise_for_status() # 捕获请求失败的情况 soup = BeautifulSoup(r.content, 'lxml') # 收集当前文章的所有<p>标签文本 article_paragraphs = [] for node in soup.find_all('p'): text = node.get_text(strip=True) # strip=True去掉多余的换行和空格 if text: # 跳过空段落 article_paragraphs.append(text) # 把当前文章的所有段落合并成一个字符串,用换行分隔 full_article = '\n\n'.join(article_paragraphs) clean_article_texts.append(full_article) except Exception as e: print(f"处理链接 {url} 时出错: {e}") clean_article_texts.append(None) # 或者用占位符标记失败的文章
关键逻辑说明
- 按文章分组:每遍历一个URL,就单独创建一个
article_paragraphs列表,专门存这篇文章的所有段落文本,避免和其他文章混淆。 - 合并段落:用
'\n\n'.join()把单篇文章的所有段落拼接成一个完整字符串,这样列表clean_article_texts的每个元素就是一篇完整文章的内容。 - 细节优化:
- 用
strip=True去掉段落文本前后的多余空格和换行,让内容更整洁; - 加了
if text:判断,跳过空的<p>标签(有些页面可能存在空段落); - 增加了异常处理,避免某个URL请求失败导致整个程序崩溃。
- 用
额外小建议
如果目标网站的正文段落有特定的class(比如<p class="article-content">),可以更精准地定位正文,避免把导航栏、页脚的无关<p>标签也爬进来:
soup.find_all('p', class_='article-content') # 替换成实际的class名
慢慢来,你已经迈出了很好的一步啦!
内容的提问来源于stack exchange,提问作者OgnjanD
相关产品推荐
相关产品推荐

