使用Selenium/Selenium Base抓取网页数据至Excel的技术问题
问题1:修正
out_pocket_price的代码错误 原代码存在两个核心问题:
By.CLASS_NAME仅支持单个类名,你传入的是多类名组合,会直接触发报错,应改用By.CSS_SELECTOR,将多个类名用.连接- 获取到WebElement对象后,不能直接与字符串拼接,需要提取元素的文本内容(
.text属性)
另外,既然继承了Selenium Base的BaseCase,建议使用框架自带的self.find_element()方法,而非原生driver.find_element(),这样能更好利用Selenium Base的自动等待机制,避免元素未加载完成导致的报错。
修正后的代码片段:
# 改用CSS_SELECTOR定位,并用Selenium Base方法获取元素 out_pocket_price_element = self.find_element(By.CSS_SELECTOR, ".text-[40px].text-[#2962FF].leading-[58px].mb-3.tracking-tight.smooth") # 提取元素文本并去除前后空白 out_pocket_price = out_pocket_price_element.text.strip() print(f"out of pocket price: {out_pocket_price}")
如果担心元素加载延迟,可加上显式等待(Selenium Base封装了更简洁的实现):
# 等待元素可见,最长等待10秒 out_pocket_price_element = self.wait_for_element_visible(By.CSS_SELECTOR, ".text-[40px].text-[#2962FF].leading-[58px].mb-3.tracking-tight.smooth", timeout=10) out_pocket_price = out_pocket_price_element.text.strip()
问题2:抓取数据存入Excel(无VALUE属性的情况)
即使HTML元素没有value属性,只要能通过文本、标签内容获取数据,就可以正常抓取。以下是完整实现步骤,以抓取医院名称、自付价格为例:
- 将抓取到的数据整理为字典或列表格式
- 用
pandas创建DataFrame - 调用
to_excel()方法写入Excel文件
修改后的完整代码示例:
import pandas as pd from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.chrome.options import Options from selenium.webdriver.chrome.service import Service from seleniumbase import BaseCase s=Service('/Users/[name]/Desktop/chromedriver') chromeOptions = Options() chromeOptions.headless = False class RecorderTest(BaseCase): def test_recording(self): self.open("https://www.finestrahealth.com/") self.assert_exact_text("finestra", 'a[href="/"] span') self.type('input[placeholder="Procedure"]', "mri") self.type('input[placeholder="Zip code"]', "60007") self.type('input[placeholder="Insurance"]', "atena") self.click('button:contains("Search")') self.assert_element('main p:contains("Hospitals")') # 抓取自付价格 out_pocket_price = self.wait_for_element_visible( By.CSS_SELECTOR, ".text-[40px].text-[#2962FF].leading-[58px].mb-3.tracking-tight.smooth", timeout=10 ).text.strip() # 抓取第一个医院名称(替换为实际页面的选择器) hospital_name = self.wait_for_element_visible( By.CSS_SELECTOR, ".YOUR_HOSPITAL_NAME_SELECTOR", timeout=10 ).text.strip() # 整理数据为字典 data = { "医院名称": [hospital_name], "自付价格": [out_pocket_price] } # 转为DataFrame df = pd.DataFrame(data) # 写入Excel,index=False移除默认索引列 df.to_excel("医疗价格数据.xlsx", index=False) self.sleep(2) if __name__ == "__main__": from pytest import main main([__file__])
注意事项:
- 替换
.YOUR_HOSPITAL_NAME_SELECTOR为实际页面中医院名称元素的CSS选择器(可通过浏览器开发者工具查看) - 若要抓取多条数据(如所有医院信息),可使用
self.find_elements()获取元素列表,循环提取文本后添加到数据列表中 - 如需追加数据到已有Excel文件,可先读取原有文件,合并数据后再写入
内容的提问来源于stack exchange,提问作者imherebcsomethingisntworking
相关产品推荐
相关产品推荐

