Selenium无法获取JavaScript网页游戏数据,求技术解决方案
解决Selenium定位Math Playground游戏元素失败的问题
问题根源
这款乘法拔河游戏的题目、选项都是SVG格式的图形元素,Selenium默认的定位逻辑没法直接识别SVG内的标签——你复制的XPath是针对HTML元素写的,但SVG属于独立的命名空间,直接用text、g这些标签名定位,Selenium会当成HTML元素查找,自然找不到匹配项。
解决办法
1. 适配SVG元素的XPath写法
定位SVG内的元素时,需要用local-name()指定标签名,避开命名空间问题。把你原来的XPath改成这种格式:
//*[@id="main"]//*[local-name()='g'][9]//*[local-name()='g'][1]//*[local-name()='g'][1]//*[local-name()='text'][3]
核心就是把每个SVG标签(比如g、text)替换成*[local-name()='标签名']的形式。
2. 修正后的代码示例
from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC opt = Options() opt.add_experimental_option("debuggerAddress", "127.0.0.1:8989") # 路径前加r避免转义字符问题,chrome_options已废弃改用options参数 driver = webdriver.Chrome(executable_path=r"C:\Users\Owner\Desktop\Coding\chrome\chromedriver.exe", options=opt) # 用等待确保元素加载完成,避免动态加载导致定位失败 wait = WebDriverWait(driver, 10) question_element = wait.until( EC.visibility_of_element_located( (By.XPATH, '//*[@id="main"]//*[local-name()="g"][9]//*[local-name()="g"][1]//*[local-name()="g"][1]//*[local-name()="text"][3]') ) ) print(question_element.text) # 定位四个选项的通用写法 options = driver.find_elements(By.XPATH, '//*[@id="main"]//*[local-name()="g"][contains(@transform, "translate")]//*[local-name()="text"]') for option in options: print(option.text)
3. 额外提醒
- 游戏元素是动态生成的,必须加
WebDriverWait等待元素可见,否则容易出现定位失败; - 可以在浏览器开发者工具里,对着SVG元素右键复制「完整XPath」,再手动把SVG标签替换成
*[local-name()='标签名']的形式,定位会更精准。
内容的提问来源于stack exchange,提问作者twitterL9
相关产品推荐
相关产品推荐

