我用“BeautifulSoup”提取了某个脚本的内容。脚本的内容包含“类似json”的结构化数据。
我想提取第一个“content”组的三个“url”和第二个“content”组的“defeatedBosses”。
这是提取的脚本内容(部分):
new WH.Wow.TodayInWow(WH.ge('tiw-standalone'), [{
"id": "dungeons-and-raids",
"groups": [{
"content": {
"lines": [{
"icon": "achievement_boss_archaedas",
"url": "\/affix=9\/tyrannical"
}, {
"icon": "spell_shaman_lavasurge",
"url": "\/affix=3\/volcanic"
}, {
"icon": "spell_shadow_bloodboil",
"url": "\/affix=8\/sanguine"
}],
"icons": "large"
},
"id": "mythicaffix",
}, {
"content": {
"defeatedBosses": 9,
},
"id": "mythic-progression",
"url": "\/aberrus-the-shadowed-crucible\/overview"
},
...
到目前为止,我的Python(3.11)脚本:
import re
import json
from bs4 import BeautifulSoup
from urllib.request import Request, urlopen
import json
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_sp = all_scripts[36]
// My try
model_data = re.search(r"content = ({.*?});", script_sp, flags=re.S)
model_data = model_data.group(1)
model_data = json.loads(model_data)
print(model_data)
我得到一个错误:
TypeError: expected string or bytes-like object, got 'Tag'
2条答案
按热度按时间62o28rlo1#
给出错误:TypeError:需要字符串或字节类对象,得到“Tag”
你应该调用
.string
:如果一个标签只有一个子标签,并且该子标签是NavigableString,则该子标签将以.string的形式提供:
此外,我还将你的正则表达式设置为:
打印大量JSON数据。
要获得实际所需的值,我将它留给你,因为它太多的JSON找到正确的路径:)
vjhs03f72#
下面是一个例子,你可以如何下载页面,解析所需的数据和打印样本信息(关于美国地下城和突袭的信息):
图纸:
编辑:为了更容易搜索,我建议将JSON数据从列表转换为字典:
图纸: