网页爬取中提取文章段落问题:循环<p>标签失败求助
问题分析与解决方案
你的代码目前仅提取了每篇文章中id为absatz1的单个<p>标签,既没有遍历所有段落,还可能因部分文章不存在该id标签,导致生成的内容列表出现空值,或与你预期的“每篇文章对应多段内容”结构不符,最终出现链接列表与段落列表长度不一致的问题。
修正后的代码
import requests from bs4 import BeautifulSoup import re diepresse_url='https://www.diepresse.com/' html = requests.get(diepresse_url) bsobj = BeautifulSoup(html.content, 'lxml') links = [] # 抓取文章链接并去重 for link in bsobj.find_all('a', attrs={'href': re.compile("^https://www.diepresse.com/6")}): href = link.get('href') if href not in links: links.append(href) # 存储每篇文章的完整内容 article_contents = [] for l in links: try: page = requests.get(l, timeout=10) page.raise_for_status() # 捕获请求错误 soup = BeautifulSoup(page.content, 'lxml') # 定位文章主体区域(需根据实际页面结构调整,示例假设内容在class为"article-body"的容器内) article_body = soup.find('div', class_='article-body') if not article_body: article_contents.append("无有效文章内容") continue # 遍历该区域内所有<p>标签,提取非空文本 paragraphs = [] for p_tag in article_body.find_all('p'): text = p_tag.get_text(strip=True) if text: paragraphs.append(text) # 将当前文章的所有段落拼接为完整内容 full_content = ' '.join(paragraphs) article_contents.append(full_content) except Exception as e: print(f"处理链接 {l} 时出错: {str(e)}") article_contents.append(f"处理失败: {str(e)}") # 验证长度一致性 print(f"链接数量: {len(links)}") print(f"文章内容数量: {len(article_contents)}")
关键修改点
- 链接去重:避免重复处理同一篇文章,减少无效请求。
- 定位文章主体:先找到文章内容的专属容器(需根据目标网站实际HTML结构替换
article-body),避免抓取导航、页脚等无关的<p>标签。 - 遍历所有段落:在文章主体内遍历全部
<p>标签,提取所有段落文本,而非仅抓取单个id的标签。 - 异常处理:捕获请求超时、页面不存在等错误,避免程序中断,同时记录错误信息。
- 内容过滤:过滤空段落文本,提升内容质量。
注意事项
- 需实际查看目标文章页面的HTML结构,确认文章内容所在的容器(class或id),替换代码中对应的选择器。
- 频繁请求可能触发网站反爬机制,建议添加请求间隔(如
time.sleep(1)),并设置合理的请求头。
内容的提问来源于stack exchange,提问作者Thulana
相关产品推荐
相关产品推荐

