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

解析HTML时出现“ResultSet object is not callable”错误的排查与解决

问题解决:Steam社区市场批量爬取的ResultSet错误修复

错误原因

  1. 调用对象错误:循环内使用items.find(),但items是findAll返回的ResultSet(结果列表),它没有find方法,必须用循环中的单个item对象来查找子元素。
  2. 全局查找重复取值:循环里多次用soup.find()会始终返回页面第一个匹配元素,无法获取当前商品的对应信息,必须基于当前item进行子元素查找。

修复后的代码

import requests                 
from bs4 import BeautifulSoup
import pandas as pd  # 后续整理表格需引入pandas

url = "https://steamcommunity.com/market/"
headers = {'User-Agent':"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36"}
r = requests.get(url, headers = headers)    

soup = BeautifulSoup(r.text, "lxml")

# 改用find_all(和findAll功能一致,更符合BeautifulSoup规范)
items = soup.find_all('a', class_= 'market_listing_row_link')

data = []

for item in items:
    # 基于当前item查找对应子元素,而非全局soup或items列表
    listing_row = item.find("div", class_= "market_listing_row market_recent_listing_row market_listing_searchresult")
    if not listing_row:  # 增加空值判断,避免页面结构异常时报错
        continue
    price_block = listing_row.find('div', class_= "market_listing_price_listings_block")
    # 获取批次数量并清理文本
    quality = price_block.find('span', class_="market_table_value").text.strip()
    # 获取常规价格并清理文本
    normprice = price_block.find('span', class_="normal_price").text.strip()
    # 获取游戏名称并清理文本
    games = listing_row.find('div', class_= "market_listing_item_name_block").find('span', class_="market_listing_game_name").text.strip()
    
    data.append([quality, normprice, games])

# 转换为pandas表格
df = pd.DataFrame(data, columns=['批次数量', '常规价格', '游戏名称'])
print(df)

关键修改点

  • 将循环内的items.find()和soup.find()全部替换为基于当前item的查找,确保每个商品取对应自身的信息。
  • 增加空值判断逻辑,避免页面结构异常时抛出AttributeError。
  • 用strip()去除文本中的多余空格、换行符,让数据更整洁。
  • 引入pandas并将采集到的数据转换为DataFrame,直接完成后续表格整理需求。

内容的提问来源于stack exchange,提问作者Влад Ярмолюк

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 10:30:47