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

Python XPath返回空列表而非目标值'Mar 17',求问题排查

排查你的Python爬虫返回空列表问题

让我们一步步找出问题所在,帮你拿到预期的'Mar 17':

问题1:异常处理的潜在风险

你的try-except块里,当请求出现超时或连接错误时只是pass,但后续代码依然会执行tree = html.fromstring(page.content)——这时候page变量根本没被赋值,会直接抛出NameError。虽然你说当前返回空列表,说明这次请求没触发异常,但这个问题必须修复,避免后续运行崩溃。

问题2:XPath路径过于脆弱且未提取文本

你写的XPath依赖一堆嵌套的div索引(比如div[3]/div[2]...),这种路径非常不稳定,只要页面结构微调(比如网站加了新广告栏、调整布局),XPath就会失效。而且,你当前的XPath返回的是元素对象列表,没有提取元素里的文本内容,就算找到元素,打印的也不是你要的日期字符串。

修复方案

步骤1:完善异常处理

在异常时添加明确的处理逻辑,避免后续代码报错:

import requests
from lxml import html

url = "http://www.moneycontrol.com/financials/20microns/balance-sheetVI/2M"
try:
    page = requests.get(url, timeout=5)
    page.raise_for_status()  # 检查请求是否成功(比如404、500错误)
except requests.Timeout:
    print("请求超时,请稍后重试")
    exit()
except requests.ConnectionError:
    print("连接失败,请检查网络或网址")
    exit()
except requests.HTTPError as e:
    print(f"HTTP错误: {e}")
    exit()

步骤2:使用更稳定的XPath并提取文本

观察目标页面结构,我们可以用更精准的属性定位表格(目标表格的id为yearly,是页面展示年度财务数据的核心表格),然后提取目标单元格的文本:

tree = html.fromstring(page.content)
# 定位目标表格,提取第一行第二列的文本内容
yrs = tree.xpath('//table[@id="yearly"]/tbody/tr[1]/td[2]/text()')
# 处理结果:找到数据就输出,否则提示未找到
print(yrs[0].strip() if yrs else "未找到目标数据")

这样修改后,就能正确提取到'Mar 17'啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:13:56