You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用lxml XPath无法获取JS生成页面元素的问题求助

为什么用requests+lxml爬取PUBG Tracker页面时Xpath返回空数组?

我来帮你拆解下问题的核心原因:

你在Chrome控制台里能用Xpath定位到目标元素,但用requests+lxml却返回空数组,本质是页面渲染方式的差异:

  • 当你调用requests.get()时,拿到的是服务器直接返回的原始HTML代码。而PUBG Tracker的玩家排名这类动态数据,是通过JavaScript在浏览器端后续加载、渲染生成的——服务器返回的原始HTML只是一个空框架,根本没有你要找的那个元素节点。
  • 但Chrome控制台里看到的页面,是浏览器执行完所有JS代码后的最终DOM结构,这时候动态数据已经渲染完成,所以你的Xpath能正常定位到元素。

快速验证这个结论的方法

你可以把page.content保存成一个本地HTML文件,用浏览器打开看看,会发现里面完全没有//*[@id="profile"]/div[2]/div[2]/div[1]/div[2]这个节点,这就实锤了原始HTML里确实不存在该元素。

两种可行的解决办法

1. 用Selenium模拟浏览器渲染

Selenium会像真实用户一样打开浏览器,等待页面加载和JS执行完成后再获取DOM,完美匹配Chrome控制台的环境。示例代码如下:

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

@client.command(pass_context=True)
async def checkChrisPubg(ctx):
    # 初始化浏览器驱动(需提前下载对应浏览器的Driver,比如ChromeDriver)
    driver = webdriver.Chrome()
    try:
        driver.get('https://pubgtracker.com/profile/pc/Fuzzyllama/duo?region=na')
        # 显式等待元素加载完成,比time.sleep更可靠
        WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.XPATH, '//*[@id="profile"]/div[2]/div[2]/div[1]/div[2]'))
        )
        duoRank = driver.find_elements(By.XPATH, '//*[@id="profile"]/div[2]/div[2]/div[1]/div[2]')
        # 打印元素的文本内容
        print([elem.text for elem in duoRank])
    finally:
        # 无论成功失败都关闭浏览器
        driver.quit()

2. 直接请求数据API(更高效)

打开Chrome开发者工具(F12),切换到「Network」标签页,刷新页面后在「XHR」或「Fetch」分类下,找到加载玩家排名数据的API请求。这类请求通常返回JSON格式的数据,你可以直接用requests请求这个API接口,跳过页面渲染步骤,效率更高。

内容的提问来源于stack exchange,提问作者Reg Smith

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:39:26