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

使用bs4解析highshortinterest.com表格数据for循环无输出

问题根因
  • 使用默认参数的requests发起请求时,请求头自带的User-Agent会标识请求来源为Python爬虫程序,被网站反爬机制识别后,返回的页面源码中class为stocks的table标签是无内容的空标签,不存在浏览器开发者工具中看到的tbody、tr、td子节点,后续元素查找逻辑自然无返回。
  • 浏览器开发者工具展示的是页面经过JS渲染、浏览器自动补全节点后的DOM结构,和requests直接拿到的原始HTML源码不一定完全一致:很多场景下浏览器会自动给table节点补全tbody层级,但原始源码里tr是直接挂载在table节点下的,显式查找tbody反而会匹配失败。
修正代码
from bs4 import BeautifulSoup
import requests

urlSI = "https://highshortinterest.com/"
# 补充真实浏览器请求头,绕过基础反爬校验
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"
}
pageSI = requests.get(urlSI, headers=headers)
soupSI = BeautifulSoup(pageSI.text, 'html.parser')

stocks = soupSI.find('table', class_='stocks')
# 跳过tbody层级直接查找所有行,适配原始源码结构
rows = stocks.find_all('tr')
for row in rows:
    info = row.find_all('td')
    # 跳过表头、空行等td数量不足的无效行,避免索引报错
    if len(info) < 6:
        continue
    company = info[0].text
    exchange = info[1].text
    si = info[2].text
    s_float = info[3].text
    outstd = info[4].text
    industry = info[5].text
    # 按需打印结果验证
    print(company, exchange, si, s_float, outstd, industry)
补充说明
  • 如果运行后仍存在解析异常,可以安装lxml解析库,将BeautifulSoup初始化参数替换为BeautifulSoup(pageSI.text, 'lxml'),该解析器容错性更高。
  • 定位元素过程中可以随时打印元素内容,确认请求实际返回的源码结构,不要完全依赖浏览器开发者工具展示的DOM层级做判断。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 13:03:21