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

使用BeautifulSoup提取脚本类JSON数据遇TypeError问题求助

问题解决与数据提取方案

错误原因分析

报错TypeError: expected string or bytes-like object, got 'Tag'是因为你直接将BeautifulSoup返回的Tag对象传给了re.search,而该方法需要字符串/字节类型的输入。此外,你的正则表达式匹配的内容与目标脚本结构不符,且原数据存在JSON不允许的尾逗号(如"id": "mythicaffix",末尾的逗号),直接解析会报错。

修正后的完整代码

import re
import json
from bs4 import BeautifulSoup
from urllib.request import Request, urlopen

req = Request('https://www.wowhead.com/today-in-wow', headers={'User-Agent': 'Mozilla/5.0'})
html_page = urlopen(req).read()

soup = BeautifulSoup(html_page, "html.parser")

all_scripts = soup.find_all('script')
# 获取目标脚本的文本内容(注意:脚本索引可能随页面更新变化,若失效可检查脚本内容调整索引)
script_text = all_scripts[36].text

# 提取WH.Wow.TodayInWow的第二个参数(目标数组数据)
match = re.search(r"new WH\.Wow\.TodayInWow\(WH\.ge\('tiw-standalone'\), (.*?)\);", script_text, flags=re.S)
if not match:
    print("未找到目标数据")
    exit()

raw_data = match.group(1)
# 清理JSON不允许的尾逗号(如",}"或",]")
cleaned_data = re.sub(r",\s*([}\]])", r"\1", raw_data)

# 解析JSON
model_data = json.loads(cleaned_data)

# 提取目标数据
# 第一个content组的三个url
first_content_lines = model_data[0]['groups'][0]['content']['lines']
affix_urls = [line['url'] for line in first_content_lines]
# 第二个content组的defeatedBosses
defeated_bosses = model_data[0]['groups'][1]['content']['defeatedBosses']

# 输出结果
print("三个Affix URL:")
for url in affix_urls:
    print(url)
print(f"\n击败的BOSS数量:{defeated_bosses}")

关键说明

  1. 获取脚本文本:使用script_tag.text将Tag对象转换为字符串,供正则处理。
  2. 正则匹配目标数据:针对原脚本的new WH.Wow.TodayInWow(..., [数据])结构,提取第二个参数的数组内容。
  3. 清理尾逗号:JSON标准不允许尾逗号,用正则替换掉,}和,]前的逗号,避免解析报错。
  4. 提取目标字段:根据数据结构,从解析后的JSON中逐层提取lines里的url,以及defeatedBosses字段。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 12:42:47