如何用Selenium和Python抓取表格指定列(Symbol、Name)数据
问题解决:提取纳斯达克NDX指数表格的Symbol和Name列数据
你目前的代码仅获取了表格的行元素对象集合,并未从这些元素中提取具体文本内容,同时还有几处细节需要优化,以下是完整解决方案:
核心问题说明
find_elements()返回的是WebElement对象列表,而非直接的文本数据。要拿到Symbol和Name,需要遍历每个行元素,再定位到对应列的子元素并提取文本。另外1秒的隐式等待时长过短,大概率不足以让表格完全加载完成,易导致元素定位失败。
修改后的代码
from selenium.webdriver.common.by import By from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 初始化浏览器(注意:ChromeDriver版本需与本地浏览器匹配) driver = webdriver.Chrome() url = "https://www.nasdaq.com/market-activity/quotes/nasdaq-ndx-index" driver.get(url) # 用显式等待确保表格完全加载,比隐式等待更可靠 wait = WebDriverWait(driver, 15) table_rows = wait.until( EC.presence_of_all_elements_located((By.CLASS_NAME, "nasdaq-ndx-index__row")) ) # 遍历行元素,提取Symbol和Name stock_data = [] for row in table_rows: try: # 定位Symbol列(基于页面实际CSS类名) symbol = row.find_element(By.CSS_SELECTOR, ".nasdaq-ndx-index__cell--symbol").text # 定位Name列 name = row.find_element(By.CSS_SELECTOR, ".nasdaq-ndx-index__cell--name").text stock_data.append({"Symbol": symbol, "Name": name}) except Exception: # 跳过表头或加载异常的行 continue # 输出结果 for item in stock_data: print(f"Symbol: {item['Symbol']}, Name: {item['Name']}") driver.quit()
关键优化点
- 显式等待:用
WebDriverWait替代短时长的隐式等待,确保表格元素完全渲染后再操作,避免动态页面加载导致的元素丢失问题。 - 子元素定位:在每行元素内部通过CSS选择器定位目标列,相比绝对XPath更稳定,页面结构小幅度变动时不易失效。
- 异常处理:加入try-except跳过表头行或加载异常的行,避免程序直接崩溃。
额外补充(针对滚动加载场景)
如果表格需要下拉页面才能加载更多行,可以在遍历前添加滚动操作:
# 重复滚动3次加载更多内容(可根据实际情况调整次数) for _ in range(3): driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") wait.until(EC.presence_of_all_elements_located((By.CLASS_NAME, "nasdaq-ndx-index__row")))
内容的提问来源于stack exchange,提问作者maynull
相关产品推荐
相关产品推荐

