Python Selenium XPath定位表格返回空字符串问题排查
问题产生原因
- 标签内容默认隐藏、hash跳转不触发激活:该站点的标签切换完全由前端JS控制,你直接访问带
#tabs-3的锚点链接,不会自动把第三个标签切为激活状态;目标表格所在的标签面板默认加了display: none样式处于隐藏状态,Selenium对隐藏元素调用.text会直接返回空字符串。此时页面实际激活的是第一个标签,所以你取页面innerHTML只能拿到第一个标签的内容。 - 没有等待动态内容加载:页面初始渲染、标签切换、表格数据拉取填充都是异步执行的,你发起页面请求后立刻查找元素,此时表格的外层DOM节点虽然已经存在(所以
find_element不会抛异常),但内部的动态数据还没填充,自然拿不到有效内容。 - 你使用的
find_element_by_xpath是Selenium 3的已废弃API,在Selenium 4版本下兼容性差,很容易出现元素定位成功但交互/取值异常的问题。
解决步骤
- 页面初始加载完成后,主动定位第三个标签的触发按钮执行点击,手动激活目标标签,不要依赖hash锚点自动切换。
- 配置显式等待,等标签切换完成、表格内部的行元素渲染可见后,再提取表格内容,不要在页面刚跳转就立刻取数据。
- 替换废弃的元素定位API,使用Selenium 4原生支持的
By类定位方式,避免兼容性问题。
修正后参考代码
from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 初始化浏览器驱动 PATH = "C:\Program Files (x86)\chromedriver.exe" tubitak_ua_driver = webdriver.Chrome(service=Service(PATH)) # 设置最长15秒的显式等待 wait = WebDriverWait(tubitak_ua_driver, 15) tubitak_ua_driver.get("https://uidb-pbs.tubitak.gov.tr/#tabs-3") # 主动点击激活第三个标签 third_tab = wait.until(EC.element_to_be_clickable((By.XPATH, '//li[@aria-controls="tabs-3"]'))) third_tab.click() # 等待表格主体可见、内部数据行渲染完成 project_table_tbody = wait.until(EC.visibility_of_element_located((By.XPATH, '//*[@id="programCagriListTable"]/tbody'))) wait.until(EC.presence_of_all_elements_located((By.XPATH, '//*[@id="programCagriListTable"]/tbody/tr'))) # 此时提取文本即可拿到正常内容 print(project_table_tbody.text) # 用完后关闭驱动 # tubitak_ua_driver.quit()
额外注意事项
- 如果页面首次加载弹出Cookie同意提示、公告弹窗,要先定位弹窗关闭按钮执行点击,否则标签点击会被遮挡层拦截,导致切换失效。
- 如果点击标签后出现加载转圈动画,可以额外加等待逻辑等加载动画节点消失后再取表格内容,避免拿到加载中的空状态。
- 该表格为分页展示,需要模拟翻页操作才能拿到全量数据,上述代码仅能拿到默认第一页展示的内容。
内容的提问来源于stack exchange,提问作者Talha002
相关产品推荐
相关产品推荐

