使用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}")
关键说明
- 获取脚本文本:使用
script_tag.text将Tag对象转换为字符串,供正则处理。 - 正则匹配目标数据:针对原脚本的
new WH.Wow.TodayInWow(..., [数据])结构,提取第二个参数的数组内容。 - 清理尾逗号:JSON标准不允许尾逗号,用正则替换掉
,}和,]前的逗号,避免解析报错。 - 提取目标字段:根据数据结构,从解析后的JSON中逐层提取
lines里的url,以及defeatedBosses字段。
内容的提问来源于stack exchange,提问作者Zerers
相关产品推荐
相关产品推荐

