如何用Selenium+Python爬取折叠式FAQ页面并生成Pandas DataFrame
爬取折叠式FAQ并生成Pandas DataFrame解决方案
针对目标页面的折叠式FAQ结构,以下是可行的Selenium爬取方案,核心是正确定位折叠面板元素并处理展开动作:
核心定位逻辑
- FAQ条目容器:页面内每个FAQ项都包裹在
accordion-item类的div中,用XPATH//div[@class='accordion-item']可获取所有FAQ条目。 - 展开触发按钮:每个FAQ的标题按钮是展开入口,相对XPATH为
.//div[@class='accordion-header']/button(基于当前FAQ容器定位,避免跨条目干扰)。 - 内容提取路径:问题文本直接取标题按钮的内容;答案需等待面板展开后,从
accordion-body类的div中提取,相对XPATH为.//div[@class='accordion-collapse show']//div[@class='accordion-body']//text()。
完整代码示例
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import pandas as pd # 初始化Chrome浏览器(确保ChromeDriver环境配置正确) driver = webdriver.Chrome() driver.get("https://internet.safaricom.co.ke/faqs/home") # 等待页面加载完成,直到第一个FAQ项出现 wait = WebDriverWait(driver, 10) wait.until(EC.presence_of_element_located((By.XPATH, "//div[@class='accordion-item']"))) # 存储FAQ数据的列表 faq_data = [] # 获取所有FAQ条目 faq_items = driver.find_elements(By.XPATH, "//div[@class='accordion-item']") for item in faq_items: try: # 等待当前FAQ的标题按钮可点击并展开 question_btn = WebDriverWait(item, 5).until(EC.element_to_be_clickable((By.XPATH, ".//div[@class='accordion-header']/button"))) question_btn.click() # 等待答案区域完全展开可见 WebDriverWait(item, 5).until(EC.visibility_of_element_located((By.XPATH, ".//div[@class='accordion-collapse show']"))) # 提取问题文本并清理格式 question = question_btn.text.strip() # 提取答案文本,合并零散文本节点并清理多余空格 answer_parts = item.find_elements(By.XPATH, ".//div[@class='accordion-collapse show']//div[@class='accordion-body']//text()") answer = " ".join([part.strip() for part in answer_parts if part.strip()]) # 将当前FAQ数据加入列表 faq_data.append({"问题": question, "答案": answer}) except Exception as e: print(f"处理FAQ条目时出错: {str(e)}") continue # 关闭浏览器 driver.quit() # 转换为Pandas DataFrame faq_df = pd.DataFrame(faq_data) print(faq_df.head()) # 可选:保存为CSV文件 # faq_df.to_csv("safaricom_faq.csv", index=False, encoding="utf-8")
关键注意事项
- 相对XPATH:使用
.开头的相对路径,确保仅在当前FAQ条目范围内查找元素,避免跨条目定位错误。 - 等待机制:必须依赖WebDriverWait处理动态加载,避免元素未就绪导致的定位失败或文本为空问题。
- 异常处理:加入try-except块捕获单个条目处理异常,保证程序能继续处理后续FAQ。
内容的提问来源于stack exchange,提问作者Hummer
相关产品推荐
相关产品推荐

