如何用BeautifulSoup抓取指定div元素并合并内容至同一列?
问题解决与代码调整
核心问题修正与优化点
- 原代码重复发起两次HTTP请求,浪费资源,保留一次带headers的请求即可
- 抓取
unformatted-text-box的逻辑有误:无需定位内部a标签,直接提取该div的文本内容即可;同时需先判断元素是否存在,避免触发异常 - 新增对
title和content的空值处理,防止页面结构变化导致脚本崩溃 - 将抓取到的未格式化文本直接拼接进
Content列,不再单独设列
修改后的完整代码
import requests from bs4 import BeautifulSoup # 示例headers,可根据实际情况调整 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36' } urls = [ 'https://www.studypool.com/discuss/18233577/obtain-a-copy-of-the-financial-statements-for-a-publicly-traded-company-then-complete-a-ratio-analysis', 'https://www.studypool.com/discuss/18898929/financial-accounting-questions-multiple-choice-about-the-chapter-cash-amp-investments', 'https://www.studypool.com/discuss/18237517/compare-forms-of-fundamental-and-technical-analyses' ] def transform(url): # 仅发起一次HTTP请求 response = requests.get(url, headers=headers) soup = BeautifulSoup(response.text, 'html.parser') # 处理标题的空值情况 title = soup.find('h1', {'class': 'question-title'}) title_text = title.text.strip() if title else '' # 处理主内容的空值情况 content = soup.find('div', {'class': 'user-generated-description'}) content_text = content.text.strip() if content else '' # 正确抓取未格式化文本 textbox = soup.find('div', {'class': 'unformatted-text-box'}) textbox_text = textbox.text.strip() if textbox else '' # 合并内容:若存在未格式化文本,用换行分隔主内容与未格式化内容 merged_content = f"{content_text}\n{textbox_text}" if textbox_text else content_text return { 'Title': title_text, 'Content': merged_content }
关键调整说明
- 请求优化:删除重复的
requests.get调用,只保留带headers的单次请求,减少网络开销 - 元素抓取逻辑修正:
- 对每个目标元素先判断是否存在,再提取文本,彻底避免
AttributeError - 直接提取
unformatted-text-box的文本内容,无需定位内部a标签(原页面结构中该div的文本即为目标内容)
- 对每个目标元素先判断是否存在,再提取文本,彻底避免
- 内容合并:通过判断未格式化文本是否存在,决定是否拼接进主Content列,保证输出的CSV中Content列包含完整内容
内容的提问来源于stack exchange,提问作者GennieM
相关产品推荐
相关产品推荐

