Selenium获取表格元素文本问题:如何提取tbody/tr/td中的文本?
解决Selenium爬取表格文本的问题
问题根源
你用find_elements()系列方法获取到的是WebElement对象的列表,直接把列表赋值给字典字段自然会得到列表或空值;而列表本身没有.text属性,直接调用就会报错。必须遍历列表中的每个WebElement,单独提取文本。
具体解决方案
1. 确保元素加载完成(避免空列表)
用Selenium的显式等待替代硬编码等待,确保表格行完全加载后再定位,防止因页面未渲染完成导致获取到空列表:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC wait = WebDriverWait(driver, 10) wait.until(EC.presence_of_element_located((By.XPATH, "//tbody/tr")))
2. 遍历行与单元格提取文本
定位表格的所有行后,逐行遍历,再定位每行的单元格,逐个提取.text内容:
# 定位所有表格行 rows = driver.find_elements(By.XPATH, "//tbody/tr") currency_data = [] for row in rows: # 定位当前行的所有单元格 cells = row.find_elements(By.TAG_NAME, "td") # 校验单元格数量,避免索引越界 if len(cells) >= 3: iso_code = cells[0].text.strip() country = cells[1].text.strip() currency = cells[2].text.strip() currency_data.append({ "iso": iso_code, "country": country, "currency": currency })
3. 转换为Pandas DataFrame
直接将整理好的字典列表传入pd.DataFrame()即可:
import pandas as pd df = pd.DataFrame(currency_data) print(df.head())
完整可运行代码
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 import pandas as pd # 初始化浏览器 driver = webdriver.Chrome() driver.get("https://www.worlddata.info/currencies/") # 等待表格加载 wait = WebDriverWait(driver, 10) wait.until(EC.presence_of_element_located((By.XPATH, "//tbody/tr"))) # 提取表格数据 rows = driver.find_elements(By.XPATH, "//tbody/tr") currency_data = [] for row in rows: cells = row.find_elements(By.TAG_NAME, "td") if len(cells) >= 3: currency_data.append({ "iso": cells[0].text.strip(), "country": cells[1].text.strip(), "currency": cells[2].text.strip() }) # 转为DataFrame并输出 df = pd.DataFrame(currency_data) print(df.head()) # 关闭浏览器 driver.quit()
关键注意事项
- 永远不要直接对
find_elements()返回的列表调用.text,必须遍历每个元素单独提取 - 显式等待能有效避免因页面加载延迟导致的空列表问题
- 用
.strip()清理文本中的空格、换行符,保证数据整洁 - 增加单元格数量校验,防止网页结构变动引发索引越界错误
内容的提问来源于stack exchange,提问作者urdearboy
相关产品推荐
相关产品推荐

