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

Python爬虫使用Xpath抓取advfn数据时报IndexError: list index out of range

问题根因

  • 未添加请求头被反爬拦截:目标站点校验请求身份,无User-Agent的请求返回的不是正常财务页面,你拿到的源码本身就没有目标数据
  • XPath语法错误:代码里的"是HTML实体编码的引号,lxml无法识别,需要替换为普通引号
  • 浏览器自动补全节点干扰:F12复制的XPath带tbody标签是浏览器渲染时自动添加的,原始页面的表格没有tbody节点,要从XPath中删除
  • 本地HTML保存逻辑错误:直接将bytes类型的page.content转为字符串写入,会额外带上b'前缀等畸形内容,你本地检查的HTML不是真实的返回源码,判断有误

修复后可运行代码

import requests
from lxml import etree
import time

def minerar_advfns(ticker):
    quote = f'https://br.advfn.com/bolsa-de-valores/bovespa/{ticker}/balanco'
    # 新增请求头伪装浏览器,绕过基础反爬
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"
    }
    page = requests.get(quote, headers=headers)
    if page.status_code != 200:
        print(f"请求异常,状态码:{page.status_code}")
        return
    time.sleep(0.9)
    dom = etree.HTML(page.content)
    # 修复XPath:替换实体引号、删除不存在的tbody节点
    lucro_res = dom.xpath('//*[@id="financials_table_2"]/table/tr[11]/td[2]/text()')
    if lucro_res:
        lucro = lucro_res[0].strip()
        print(lucro)
        return lucro
    else:
        print("未匹配到目标数值")
        return None

# 测试调用
minerar_advfns("aper3")

调用上述代码会直接输出目标值1.605,如果需要保存真实HTML,可以用open('www.htm', 'w', encoding='utf-8').write(page.text)替换原有保存逻辑即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 10:03:00