You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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属性,只要能通过文本、标签内容获取数据,就可以正常抓取。以下是完整实现步骤,以抓取医院名称、自付价格为例:

  1. 将抓取到的数据整理为字典或列表格式
  2. 用pandas创建DataFrame
  3. 调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 08:31:17