解析HTML时出现“ResultSet object is not callable”错误的排查与解决
问题解决:Steam社区市场批量爬取的ResultSet错误修复
错误原因
- 调用对象错误:循环内使用
items.find(),但items是findAll返回的ResultSet(结果列表),它没有find方法,必须用循环中的单个item对象来查找子元素。 - 全局查找重复取值:循环里多次用
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,提问作者Влад Ярмолюк
相关产品推荐
相关产品推荐

