使用BeautifulSoup从指定id的div提取嵌套question与answer内容
目标内容爬取逻辑补全
原代码的核心疏漏
- 定位
question-group节点时使用find方法,仅能抓取容器内第一个匹配的子块,无法遍历全量分组 - 仅提取了问题文本,未关联同分组下对应的answer内容元素
- 查找逻辑未锁定范围,容易被页面上同结构、同类名的外部div块干扰
实现思路
- 给请求补充基础浏览器请求头,避免目标站点拦截爬虫,返回无效的HTML内容
- 先定位到id为
participant的唯一目标容器,将后续所有查找操作的范围锁定在该容器内部,从根源上避免误抓外部同结构的div块 - 利用BeautifulSoup的递归查找特性,不需要逐层匹配中间嵌套的
panel-body/row/col-sm-12等层级类名,直接在容器范围内抓取所有question-group子节点 - 遍历每个分组节点,分别提取问题、答案文本,清洗冗余换行、空白字符后完成配对
完整可运行代码
from bs4 import BeautifulSoup import requests import pandas as pd # 配置请求头,模拟正常浏览器访问 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36" } url = "https://www.ifrs.org/use-around-the-world/use-of-ifrs-standards-by-jurisdiction/paraguay" # 发起请求获取页面内容 html_content = requests.get(url, headers=headers).text soup = BeautifulSoup(html_content, "lxml") # 定位唯一的目标容器,id在页面中全局唯一,无需find_all participant_container = soup.find("div", attrs={"id": "participant"}) # 抓取容器内全量question-group,适配多类名的匹配场景 all_question_groups = participant_container.find_all( lambda tag: tag.name == "div" and "question-group" in tag.get("class", []) ) # 遍历分组完成问题-答案配对 qa_result = [] for group in all_question_groups: question_node = group.find("h5", attrs={"class": "question"}) answer_node = group.find("div", attrs={"class": "answer"}) # 跳过缺失元素的无效分组 if not question_node or not answer_node: continue # 提取问题文本,清洗冗余字符 question_text = question_node.get_text(strip=True).replace("\n", " ") # 提取答案文本,清洗冗余字符 answer_text = answer_node.get_text(strip=True).replace("\n", " ") qa_result.append({ "问题": question_text, "答案": answer_text }) # 整理为DataFrame输出 result_df = pd.DataFrame(qa_result) # 导出为本地CSV文件,可根据需要调整编码 result_df.to_csv("ifrs_paraguay_qa.csv", index=False, encoding="utf-8-sig")
适配说明
- 匹配
question-group时采用类名包含判断的写法,哪怕元素挂载了其他额外的类名(比如question-group active),也能正常匹配,不会因为类名不绝对相等漏抓内容 - 所有查找操作均在
participant容器范围内执行,哪怕页面其他位置存在完全相同结构、相同类名的div块,也不会被误抓取 - 文本提取使用
get_text(strip=True)方法,可自动去除首尾多余空白,配合替换换行符的操作,能输出排版整洁的文本内容 - 增加了缺失节点的判断逻辑,遇到个别异常结构的分组时不会直接中断整个爬取流程
内容的提问来源于stack exchange,提问作者user9517769
相关产品推荐
相关产品推荐

