You need to enable JavaScript to run this app. 爬取screener.in金融表格元素失败、代码返回空列表的问题咨询
优惠活动
大模型
产品
解决方案
定价
更多

爬取screener.in金融表格元素失败、代码返回空列表的问题咨询

爬取Screener.in表格数据的问题排查与修正

问题根因

  • 链接携带无效转义字符:原代码的URL直接从网页HTML源码复制,把转义实体&当成了真实参数,请求时参数解析错误,无法加载对应筛选规则的结果页。
  • 被反爬机制拦截:urllib默认发送的请求会携带Python-urllib/版本号的标识,网站识别到非浏览器访问请求后,会返回不含表格数据的空壳页面,你定位的目标div容器内自然没有<tr>标签内容。
  • 元素定位缺少校验:原代码没有判断查找的容器是否包含目标子元素,空壳页面里存在同名class的空div,才会出现“不报错但返回空列表”的现象。

修正后可运行代码

import bs4 as bs
import urllib.request
import ssl
import pandas as pd

# 关闭SSL验证适配证书校验问题
ssl._create_default_https_context = ssl._create_unverified_context

# 修正URL转义字符,构造合法请求地址
target_url = "https://www.screener.in/screen/raw/?sort=name&order=&source=&query=Market+capitalization+%3E+350&limit=50&page=1"

# 构造带浏览器请求头的请求对象,绕过基础反爬
req = urllib.request.Request(
    target_url,
    headers={
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
    }
)

# 获取真实页面内容
page_content = urllib.request.urlopen(req)
soup = bs.BeautifulSoup(page_content, "html.parser")

# 定位目标表格容器,提取所有行
table_wrapper = soup.find("div", class_="responsive-holder fill-card-width")
all_rows = table_wrapper.find_all("tr")

# 解析生成结构化数据
col_names = [th.get_text(strip=True) for th in all_rows[0].find_all("th")]
table_data = []
for row in all_rows[1:]:
    row_values = [td.get_text(strip=True) for td in row.find_all("td")]
    table_data.append(row_values)

# 输出结果验证
result_df = pd.DataFrame(table_data, columns=col_names)
print(result_df.head())

核心调整点

  • 替换URL中的无效&amp;转义字符为标准连接符&,修正参数解析错误
  • 为请求添加通用浏览器User-Agent标识,避免被网站反爬机制识别拦截
  • 补充页面元素提取的校验逻辑,避免对空容器做无效查找

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.29 11:15:08