使用Selenium抓取动态网页表格后无法获取页面显示的单元格内容
Selenium抓取页面缺失显示的名称内容
我编写了如下Selenium代码:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Chrome('C:\\chromedriver_win32\\chromedriver.exe') global_dynamicUrl = "https://draft.shgn.com/nfc/public/dp/788/grid" driver.get(global_dynamicUrl) wait = WebDriverWait(driver, 15) table_entries = wait.until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "table tr"))) print(len(table_entries)) print(table_entries) html = driver.page_source open('site.txt', 'wt').write(html) with open('site.txt', encoding='utf-8') as f: lines = f.read() driver.close()
我将抓取结果保存到文本文件用于后续分析,但检查或解析文件时,发现其中完全没有网页上显示的名称内容(可查看附图)。请问我哪里操作出错了?
问题排查与修复方案
可能的出错点及对应解决步骤:
- 等待条件不精准:当前仅等待表格行元素可见,但页面名称内容可能是异步加载的——表格行存在但内容还未填充。可以调整等待逻辑,比如等待某个具体的名称单元格元素出现,或者延长等待时长。
- 编码异常:保存
page_source时用wt模式未指定编码,可能导致部分内容乱码或丢失。修改保存代码为:open('site.txt', 'w', encoding='utf-8').write(html) - 未验证元素实际内容:可以先打印
table_entries的文本内容,确认Selenium是否真的获取到了数据:
如果这里也没有内容,说明等待策略失效,需要更换等待目标,比如等待页面for entry in table_entries: print(entry.text)document.readyState变为complete:wait.until(lambda d: d.execute_script('return document.readyState') == 'complete')
优化后的代码示例:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Chrome('C:\\chromedriver_win32\\chromedriver.exe') global_dynamicUrl = "https://draft.shgn.com/nfc/public/dp/788/grid" driver.get(global_dynamicUrl) wait = WebDriverWait(driver, 20) # 等待页面完全加载完成 wait.until(lambda d: d.execute_script('return document.readyState') == 'complete') # 等待具体的名称单元格出现,确保内容已加载 wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "table tr td:first-child"))) table_entries = wait.until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "table tr"))) print(len(table_entries)) # 验证每行内容 for entry in table_entries: print(entry.text) # 指定编码保存页面源码 html = driver.page_source open('site.txt', 'w', encoding='utf-8').write(html) driver.close()
内容的提问来源于stack exchange,提问作者Carlos Marcano
相关产品推荐
相关产品推荐

