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

