使用 Selenium 高效提取网页表格中的多行文本数据

4次阅读

使用 Selenium 高效提取网页表格中的多行文本数据

本文讲解如何用 selenium 正确遍历动态表格中的所有目标元素(如比赛对阵名称),避免因错误索引、重复点击和页面跳转导致的数据遗漏,推荐采用 find_elements + 直接解析的简洁可靠方案。

本文讲解如何用 selenium 正确遍历动态表格中的所有目标元素(如比赛对阵名称),避免因错误索引、重复点击和页面跳转导致的数据遗漏,推荐采用 find_elements + 直接解析的简洁可靠方案。

在使用 Selenium 自动化抓取网页结构化数据时,一个常见误区是:为获取表格中每行的文本内容,先计算行数、再拼接 XPath、逐个点击跳转页面、返回后再重复操作——这不仅效率低下,还极易因页面重载、元素失效或索引错位(如原文中误用 number_of_pages_to_enter 替代循环变量 i)导致只提取到单条数据。

更专业、健壮的做法是:定位到所有目标元素集合,一次性获取并解析。以目标网站 https://www.tippmix.hu/sportfogadas#?q=nba&page=1 为例,其 NBA 赛程列表位于

中,每场比赛标题链接位于

内的 标签中,且完整信息(如 “Cleveland – Dallas”)已直接嵌入该链接的可见文本内(含换行符分隔),无需跳转详情页。

以下是优化后的标准实现:

from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC  url = 'https://www.tippmix.hu/sportfogadas#?q=nba&page=1' driver = webdriver.Chrome() driver.maximize_window() driver.get(url)  # 显式等待:确保所有比赛链接完全加载并可见 wait = WebDriverWait(driver, 10) game_links = wait.until(     EC.visibility_of_all_elements_located((By.XPATH, "//tbody/tr/td[@class='title']/a")) )  cimek = [] for link in game_links:     # 每个链接文本形如 "Kosárlabda, NBAnCleveland - Dallasn02.27. 18:00"     lines = link.text.strip().split("n")     if len(lines) >= 2:         opponent_pair = lines[1].strip()  # 取第二行:对阵双方         cimek.append(opponent_pair)         print(opponent_pair)  driver.quit()

关键改进点说明:

  • 避免手动索引与 XPath 拼接:原逻辑中 for i in range(…) 却始终使用 number_of_pages_to_enter,导致循环体实际只处理最后一行;改用 find_elements 直接获取全部匹配元素,天然规避索引越界与逻辑错乱。
  • 消除不必要的页面跳转:button.click() → browser.back() 不仅慢,还易触发反爬机制或状态丢失;而目标文本已在当前页 dom 中,直接 .text 即可。
  • 增强健壮性:使用 visibility_of_all_elements_located 替代 presence_of_element_located,确保元素不仅存在,而且可见、可交互;配合 WebDriverWait 防止因加载延迟导致 NoSuchElementException。
  • 安全解析文本:对 .text 结果做 strip() 和 split(“n”) 防御性处理,避免空行或格式异常引发 IndexError。

⚠️ 注意事项:

  • 若页面使用前端路由(如本例中的 #?q=nba&page=1),需确认 Selenium 加载后 JavaScript 已完成渲染;必要时可添加 time.sleep(1) 或监听特定元素出现。
  • //tbody/tr/td[@class=’title’]/a 是相对稳定的选择器,但若网站改版,建议优先使用语义化属性(如 data-testid)或 CSS 选择器(如 table tbody td.title a)提升可维护性。
  • 生产环境中应加入异常捕获(如 try/except StaleElementReferenceException),并在循环内对每个 link 做 .is_displayed() 校验。

综上,Selenium 数据提取的核心原则是:尽可能减少 DOM 状态变更(如点击、跳转),优先利用静态结构批量定位,辅以显式等待与防御性解析。这不仅能提升脚本稳定性与执行速度,也大幅降低后期维护成本。

text=ZqhQzanResources