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
相关产品推荐
相关产品推荐

