如何使用BeautifulSoup提取<script>标签内modelData的指定字段数据
目标数据提取实现方法
你已经成功定位到了存放目标内容的script标签,接下来不需要做复杂的页面结构解析,按下面的步骤操作就能稳定拿到四个字段的值:
1. 先取出script标签内的纯文本内容
你当前代码拿到的results是BeautifulSoup的标签对象,要先把标签内嵌的JS纯文本提取出来,别把带<script>尖括号的HTML结构拿出来解析:
# 接在你现有代码的results定义后面 # 如果后续页面结构调整,靠索引取第6个script的方式可能失效,可以直接通过文本内容定位包含var modelData的标签,稳定性更高 js_content = results.get_text().strip()
2. 按需求选择适配的提取逻辑
目标数据都集中在var modelData = {...}的JS对象块里,有两种零踩坑的实现方案:
方案A:正则精准匹配(无额外依赖,适配当前场景)
四个目标字段的固定写法都是字段名: '单引号包裹的值',,直接写正则匹配即可,不会和后面store.initOmlib参数块里的同名Id字段混淆(后者是双引号包裹的JSON格式,和单引号的写法完全不冲突):
import re # 定义需要提取的目标字段列表 target_list = ["name", "thumbnailUrl", "account", "Id"] result = {} for field in target_list: # 匹配规则:字段名后跟冒号、可选空白、单引号包裹的非单引号字符内容 match_pattern = rf"{field}: '([^']*)'" matched = re.search(match_pattern, js_content) if matched: result[field] = matched.group(1) # 运行后即可得到完整的目标字段值 print(result)
执行后得到的提取结果示例:
{ 'name': 'somename', 'thumbnailUrl': 'https://website.com/blob/bG9uZ2RhbjovL0ZPVVIvbGRwcm9kLWRlL3ljb3B6YTY4N0pnQ2Nfc3JYcVV3VXc9PQ', 'account': '5LH7J44IYPAGEZEYA9KIL', 'Id': 'someid' }
方案B:JS对象转Python字典(适合后续要扩展提取更多字段的场景)
如果不想逐字段写正则规则,可以用js2py把整段modelData的JS定义转成原生Python字典,直接按键取值:
import js2py # 先从JS文本里截取完整的modelData定义块 model_block = re.search(r"var modelData = {.*?};", js_content, re.DOTALL).group() # 执行这段JS代码,拿到可交互的对象 model_data = js2py.eval_js(model_block) # 直接取字段值即可 name_val = model_data.name thumbnail_val = model_data.thumbnailUrl account_val = model_data.account id_val = model_data.Id
避坑提示
- 不要直接用标准JSON解析器处理整段script内容:modelData是原生JS对象,键没有双引号、字符串值用单引号包裹,完全不符合JSON语法,直接调用
json.loads会触发格式报错。 - 不要靠固定字符位置切片取内容:页面后续改版调整字段顺序、新增其他字段后,硬编码的切片位置会立刻失效,基于字段名的正则匹配和具体位置无关,适配性更强。
内容的提问来源于stack exchange,提问作者aquatic7
相关产品推荐
相关产品推荐

