Python Selenium爬取TradingView时部分字段返回空字符串求助
问题描述
我编写了ScrapeTech()函数爬取TradingView的股票技术数据,结果只有AMZN的lastprice和change字段能获取到有效值,GOOGL、A、V、AA这几只股票的这两个字段都返回空字符串。我试过重新复制XPATH、使用implicitly_wait()方法,但问题依然存在。
我的代码
watchlist = {"amzn", "googl", "A", "v", "AA"} def ScrapeTech(): PATH = "C:\\Program Files (x86)\\chromedriver.exe" driver = webdriver.Chrome(PATH) for stock in watchlist: driver.get("https://www.tradingview.com/symbols/" + stock + "/technicals/") driver.implicitly_wait(20) lastprice = driver.find_element_by_xpath( '//*[@id="js-category-content"]/div[1]/div[1]/div/div/div/div[3]/div[1]/div/div[1]/span[1]') change = driver.find_element_by_xpath( '//*[@id="js-category-content"]/div[1]/div[1]/div/div/div/div[3]/div[1]/div/div[2]') RSI = driver.find_element_by_xpath( '//*[@id="technicals-root"]/div/div[5]/div[1]/div[2]/table/tbody/tr[2]/td[2]') SMA50 = driver.find_element_by_xpath( '//*[@id="technicals-root"]/div/div[5]/div[2]/div[2]/table/tbody/tr[9]/td[2]') SMA100 = driver.find_element_by_xpath( '//*[@id="technicals-root"]/div/div[5]/div[2]/div[2]/table/tbody/tr[11]/td[2]') SMA200 = driver.find_element_by_xpath( '//*[@id="technicals-root"]/div/div[5]/div[2]/div[2]/table/tbody/tr[13]/td[2]') message = f"{stock}: {lastprice.text}, {change.text}, RSI: {RSI.text}, SMA50: {SMA50.text}, SMA100: {SMA100.text}, SMA200: {SMA200.text}" print(message) driver.quit()
输出结果
amzn: 100.34, +4.14 +4.30%, RSI: 61.00, SMA50: 96.22, SMA100: 95.09, SMA200: 108.50 A: , , RSI: 36.02, SMA50: 148.77, SMA100: 147.85, SMA200: 137.29 AA: , , RSI: 33.24, SMA50: 49.93, SMA100: 47.35, SMA200: 47.28 v: , , RSI: 38.17, SMA50: 223.10, SMA100: 214.90, SMA200: 207.68 googl: , , RSI: 62.82, SMA50: 94.54, SMA100: 94.13, SMA200: 101.88
解决方法
问题原因
- 绝对XPATH兼容性差:你使用的绝对XPATH仅适配AMZN的页面结构,TradingView针对不同股票的页面DOM存在细微差异,导致其他股票的
lastprice和change元素无法被定位到。 - 等待机制不完善:
implicitly_wait仅等待元素出现,但元素加载完成后文本内容可能还未渲染,直接取值会得到空字符串。
修正方案
- 改用通用定位方式:放弃绝对XPATH,通过元素的class属性定位,这类属性在所有股票页面保持一致。比如
lastprice对应CSS选择器.tv-symbol-price-quote__value.js-symbol-last,change对应.tv-symbol-price-quote__change-value。 - 使用显式等待:用
WebDriverWait等待元素可见且文本非空,确保数据完全渲染后再取值。
修正后的代码
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By from selenium import webdriver watchlist = {"amzn", "googl", "A", "v", "AA"} def ScrapeTech(): PATH = "C:\\Program Files (x86)\\chromedriver.exe" driver = webdriver.Chrome(PATH) wait = WebDriverWait(driver, 20) for stock in watchlist: driver.get(f"https://www.tradingview.com/symbols/{stock}/technicals/") # 等待lastprice元素可见并加载完成 lastprice = wait.until( EC.visibility_of_element_located((By.CSS_SELECTOR, ".tv-symbol-price-quote__value.js-symbol-last")) ) # 等待change元素可见并加载完成 change = wait.until( EC.visibility_of_element_located((By.CSS_SELECTOR, ".tv-symbol-price-quote__change-value")) ) # 其他指标同样用显式等待确保元素加载 RSI = wait.until(EC.visibility_of_element_located((By.XPATH, '//*[@id="technicals-root"]/div/div[5]/div[1]/div[2]/table/tbody/tr[2]/td[2]'))) SMA50 = wait.until(EC.visibility_of_element_located((By.XPATH, '//*[@id="technicals-root"]/div/div[5]/div[2]/div[2]/table/tbody/tr[9]/td[2]'))) SMA100 = wait.until(EC.visibility_of_element_located((By.XPATH, '//*[@id="technicals-root"]/div/div[5]/div[2]/div[2]/table/tbody/tr[11]/td[2]'))) SMA200 = wait.until(EC.visibility_of_element_located((By.XPATH, '//*[@id="technicals-root"]/div/div[5]/div[2]/div[2]/table/tbody/tr[13]/td[2]'))) message = f"{stock}: {lastprice.text}, {change.text}, RSI: {RSI.text}, SMA50: {SMA50.text}, SMA100: {SMA100.text}, SMA200: {SMA200.text}" print(message) driver.quit()
内容的提问来源于stack exchange,提问作者Haadi Saqib
相关产品推荐
相关产品推荐

