You need to enable JavaScript to run this app. 使用BeautifulSoup从指定id的div提取嵌套question与answer内容
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.01 13:24:06