如何使用BeautifulSoup提取script标签内var定义的数据并解决匹配报错
thumbdata提取报错问题解决
错误原因
re.match()方法要求匹配内容必须从字符串起始位置开始,你提取的script内容开头是sometext;加换行,并非以var thumbdata开头,因此匹配直接失败返回None,调用groups()方法自然抛出属性错误。- 正则默认不识别换行符,你的thumbdata内容跨多行,不加匹配模式的情况下
.*?只会匹配到第一行结束,无法拿到完整数据。 - 你当前正则仅捕获了
{之后的片段,没有包含完整的对象结构,且JS对象的键没有双引号,不符合JSON规范,即使匹配成功也会在json.loads阶段报错。
修正后代码
import re import json # 正则匹配逻辑 pattern = re.compile(r"var thumbdata = (.*?);", re.DOTALL) m = pattern.search(script9.string) if m: js_obj_content = m.group(1).strip() # 补全键的双引号,转为合法JSON格式 standard_json = re.sub(r'(\w+):', r'"\1":', js_obj_content) thumbdata = json.loads(standard_json) # 遍历输出thumbs for thumb in thumbdata['thumbs']: print(thumb) else: # 匹配失败的兜底逻辑,可根据需求调整 print("未找到thumbdata数据")
改动说明
- 把
re.match替换为re.search,支持在整个字符串范围内扫描匹配片段,不需要从开头对齐。 - 新增
re.DOTALL匹配模式,让.可以识别换行符,支持跨多行的内容匹配。 - 调整正则捕获规则,直接提取完整的thumbdata对象内容。
- 新增键的双引号补全逻辑,把非标准的JS对象转为合规JSON字符串,避免解析报错。
- 新增匹配结果判空逻辑,避免匹配失败时抛出属性错误。
内容的提问来源于stack exchange,提问作者Aram Gishyan
相关产品推荐
相关产品推荐

