Python使用BeautifulSoup获取同class多个div的选项文本
问题根因
你重复调用find()方法的逻辑存在缺陷:BeautifulSoup的find()方法仅会返回DOM树中第一个匹配筛选规则的元素,因此你四次调用拿到的永远是第一个class包含subject-option的div(即A选项),无法获取其余三个选项的内容。同时直接读取div的.text属性会连带取出内部空span产生的冗余空白字符,需要做简单清洗。
另外你的代码中使用Python内置类型名list作为变量名,会覆盖内置列表构造方法,存在潜在报错风险,建议替换为soup、question_item等合法变量名。
实现方案
提供两种可直接运行的实现方式,按需选择即可:
方案1:批量获取所有选项后按顺序映射
使用find_all()方法一次性获取所有符合规则的选项div,返回结果的顺序和页面DOM顺序完全一致,刚好对应A/B/C/D四个选项:
# 提取题干 question = question_item.find('pre', class_="subject-question").text.replace('\n', '').strip() # 批量获取所有选项节点 option_nodes = question_item.find_all('div', class_="subject-option") # 清洗文本:去除换行、首尾空格、连续冗余空白 options = [] for node in option_nodes: raw_text = node.text.replace('\n', '').strip() clean_text = ' '.join(raw_text.split()) options.append(clean_text) # 按顺序赋值 option_A, option_B, option_C, option_D = options
方案2:按属性精准匹配(稳定性更高)
每个选项div都自带data-option属性标记了选项标识,直接按属性匹配不会受页面选项顺序变动影响,鲁棒性更强:
# 提取题干 question = question_item.find('pre', class_="subject-question").text.replace('\n', '').strip() # 封装选项提取函数 def fetch_option(mark): node = question_item.find( 'div', class_="subject-option", attrs={"data-option": mark} ) raw_text = node.text.replace('\n', '').strip() return ' '.join(raw_text.split()) option_A = fetch_option("A") option_B = fetch_option("B") option_C = fetch_option("C") option_D = fetch_option("D")
提取效果
针对你提供的HTML片段,两种方案最终清洗得到的选项结果均为:
- option_A:
(A) बढ़ेगा - option_B:
(B) घटेगा - option_C:
(C) वही रहेगा - option_D:
(D) इनमें से कोई नहीं
完全满足CSV导入场景下的结构化数据要求,无冗余空白、无错配。
内容的提问来源于stack exchange,提问作者Raj kumar
相关产品推荐
相关产品推荐

