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

使用XPath爬取网页内容时返回空列表该如何解决

问题原因
  • 请求头校验拦截:目标站点对请求的User-Agent字段有校验逻辑,requests默认携带的python-requests/[版本号]UA会被识别为爬虫请求,返回的HTML页面内容不完整,不存在id="graphDD1"的目标元素,因此XPath查询结果为空。
  • 动态数据渲染:部分统计数据是页面加载后通过JavaScript异步请求接口、再渲染到DOM中的,静态请求拿到的原始HTML源码里本身就不包含对应数据。
解决方案

方案1:添加合法请求头(优先尝试)

先给requests请求添加浏览器UA,模拟正常用户访问,大部分场景下即可拿到完整静态页面:

from lxml import html
import requests

if __name__ == '__main__':
    url = 'https://www.leagueofgraphs.com/champions/stats/aatrox'
    # 替换为真实浏览器的User-Agent即可
    headers = {
        "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36"
    }
    page = requests.get(url, headers=headers)
    tree = html.fromstring(page.content)
    res = tree.xpath('//*[@id="graphDD1"]/text()')
    # 可通过strip()去除多余空格换行,得到干净的数值
    if res:
        print(res[0].strip())

方案2:使用JS渲染工具(动态数据场景)

如果添加UA后依然拿不到数据,说明目标数据是JS动态渲染的,需要使用支持JS渲染的工具加载完整页面后再提取,示例使用Selenium:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options

if __name__ == '__main__':
    opt = Options()
    opt.add_argument("--headless=new") # 启用无头模式,不弹出浏览器界面
    opt.add_argument("user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36")
    driver = webdriver.Chrome(options=opt)
    driver.get("https://www.leagueofgraphs.com/champions/stats/aatrox")
    target_text = driver.find_element(By.ID, "graphDD1").text
    print([target_text])
    driver.quit()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 12:54:03