使用Selenium网页抓取后Excel无结果问题求助(附代码)
问题描述
需要从戴尔支持页面提取序列号(Serial Number)和保修到期日期(Expiry Date)并导出至Excel:
- 运行Selenium代码后,仅生成带表头的空Excel文件,Chrome浏览器弹出但无法获取数据
- 尝试使用BeautifulSoup的代码则生成完全空的Excel
原Selenium代码:
from selenium import webdriver from selenium.webdriver.chrome.service import Service import pandas as pd url = "https://www.dell.com/support/home/en-sg/product-support/servicetag/0-ZUQwbW14d28xZHZBYTZWNDdHVy80Zz090/overview" path = "C:\Users\ChloeChew\Downloads\chromedriver_win32\chromedriver.exe" service = Service(executable_path=path) driver = webdriver.Chrome(service=service) driver.get(url) frame = driver.find_elements(by="xpath", value="//div[@class='product-info d-flex flex-column align-items-center d-lg-block product-info-width']") serialnumbers = [] expirydates = [] for result in frame: serialnumber = driver.find_elements(by="xpath", value="//div[@class='service-tag mb-0 d-none d-lg-block']") expirydate = driver.find_elements(by="xpath", value="//div[@class='warrantyExpiringLabel mb-0 ml-1 mr-1']") serialnumbers.append(serialnumber) expirydates.append(expirydate) my_dict = {'serialnumber' : serialnumbers, 'expirydate' : expirydates} df_headlines=pd.DataFrame(my_dict) df_headlines.to_excel("practice123.xlsx")
问题分析
- 页面加载等待缺失:页面为动态渲染,直接查找元素时内容还未加载完成,导致获取不到有效数据
- 元素处理逻辑错误:使用
find_elements()返回的是元素列表而非文本内容,直接存入列表会导致Excel中只有空对象;且循环内用全局driver查找,外层frame循环完全冗余 - 路径转义问题:Windows路径中的反斜杠未转义,可能导致ChromeDriver无法正常启动
修复后的代码
from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By import pandas as pd url = "https://www.dell.com/support/home/en-sg/product-support/servicetag/0-ZUQwbW14d28xZHZBYTZWNDdHVy80Zz090/overview" # 使用原始字符串避免转义问题,或把反斜杠替换为双反斜杠 path = r"C:\Users\ChloeChew\Downloads\chromedriver_win32\chromedriver.exe" service = Service(executable_path=path) driver = webdriver.Chrome(service=service) driver.get(url) # 等待页面关键元素加载,最长等待10秒 wait = WebDriverWait(driver, 10) serialnumbers = [] expirydates = [] # 获取序列号文本 try: serial_element = wait.until(EC.presence_of_element_located((By.XPATH, "//div[@class='service-tag mb-0 d-none d-lg-block']"))) serialnumbers.append(serial_element.text.strip()) except Exception as e: print(f"获取序列号失败: {e}") serialnumbers.append("N/A") # 获取到期日期文本 try: expiry_element = wait.until(EC.presence_of_element_located((By.XPATH, "//div[@class='warrantyExpiringLabel mb-0 ml-1 mr-1']"))) expirydates.append(expiry_element.text.strip()) except Exception as e: print(f"获取到期日期失败: {e}") expirydates.append("N/A") # 构造DataFrame并导出,关闭索引列 my_dict = {'serialnumber': serialnumbers, 'expirydate': expirydates} df = pd.DataFrame(my_dict) df.to_excel("dell_warranty_info.xlsx", index=False) driver.quit()
说明
- 添加
WebDriverWait等待元素加载,确保内容渲染完成后再获取 - 使用
find_element()(单数)获取单个元素,提取text属性得到实际内容 - 路径使用原始字符串解决转义问题
- 增加异常捕获,避免程序崩溃并标记缺失数据
- 导出时设置
index=False,避免生成不必要的索引列
内容的提问来源于stack exchange,提问作者Chloe Chew
相关产品推荐
相关产品推荐

