使用BeautifulSoup爬取Rocket League交易站如何格式化交易数据?
解决方法
核心问题是直接提取了整块DOM的文本,没有拆分单个物品节点做结构化处理,才会出现大量空白、无法格式化的问题。可按照下方方案实现需求:
完整可运行代码
@bot.command() async def rlgarage(ctx, arg): name = arg.strip() page = requests.get(f"https://rocket-league.com/player/{name}") # 检查页面请求状态 if page.status_code != 200: await ctx.send("玩家不存在或站点访问失败") return soup = BeautifulSoup(page.content, 'html.parser') # 提取持有板块物品 have_items = [] have_block = soup.find(class_="rlg-trade__itemshas") if have_block: # 遍历所有单个物品节点 for item in have_block.find_all(class_="rlg-trade__item"): # 提取属性并去除多余空白 color = item.find(class_="rlg-trade__itemcolor").get_text().strip() item_name = item.find(class_="rlg-trade__itemname").get_text().strip() amount_ele = item.find(class_="rlg-trade__itemamount") # 数量不存在时默认赋值1 amount = amount_ele.get_text().strip() if amount_ele else "1" # 按格式拼接 if amount == "1": have_items.append(f"{color} {item_name}") else: have_items.append(f"{color} {item_name} ({amount})") # 提取求购板块物品,逻辑和持有板块完全一致 want_items = [] want_block = soup.find(class_="rlg-trade__itemswants") if want_block: for item in want_block.find_all(class_="rlg-trade__item"): color = item.find(class_="rlg-trade__itemcolor").get_text().strip() item_name = item.find(class_="rlg-trade__itemname").get_text().strip() amount_ele = item.find(class_="rlg-trade__itemamount") amount = amount_ele.get_text().strip() if amount_ele else "1" if amount == "1": want_items.append(f"{color} {item_name}") else: want_items.append(f"{color} {item_name} ({amount})") # 拼接最终输出文本 output = "Has:\n\n" + "\n\n".join(have_items) + "\n\nWants:\n\n" + "\n\n".join(want_items) await ctx.send(output)
关键逻辑说明
- 放弃直接提取整块文本的方案,先定位到单个物品的DOM节点
rlg-trade__item再逐个提取属性,避免杂乱空白的干扰 - 提取每个属性时用
strip()方法自动去掉首尾的换行、空格等无效字符 - 对数量节点做判空处理,不存在时默认赋值为1,匹配需求
- 最后用
join方法把所有物品按指定的换行格式拼接,输出即可完全符合预期格式
内容的提问来源于stack exchange,提问作者Pricysquirrl
相关产品推荐
相关产品推荐

