爬取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中的无效
&转义字符为标准连接符&,修正参数解析错误 - 为请求添加通用浏览器User-Agent标识,避免被网站反爬机制识别拦截
- 补充页面元素提取的校验逻辑,避免对空容器做无效查找
内容的提问来源于stack exchange,提问作者user38108
相关产品推荐
相关产品推荐

