求助:如何使用正则表达式从HTML源码提取JSON数据并转为Python字典
解决从HTML源码中提取嵌入JSON并转为Python字典的问题
你已经找对了正则模式,接下来只需要把正则和文本内容结合,再解析成字典就行。我帮你完善了脚本,加上了关键的匹配和解析步骤,还做了健壮性处理:
import requests import json import re url = 'https://www.dunelm.com/product/caldonia-check-natural-eyelet-curtains-1000187301?defaultSkuId=30729125' r = requests.get(url) r.encoding = 'utf-8' # 确保中文等特殊字符编码正确 # 推荐用requests返回的原始HTML文本(避免BeautifulSoup修改源码结构导致正则失效) html_content = r.text # 如果你想用之前保存的sourcecode.html文件,就注释掉上面一行,打开下面的代码 # with open("sourcecode.html", "r", encoding='utf-8') as file: # html_content = file.read() # 正则匹配目标JSON,注意加上re.DOTALL让.匹配换行符(JSON可能跨多行) regex_pattern = r'{"delivery".*false}}}' match_result = re.search(regex_pattern, html_content, re.DOTALL) if match_result: # 提取匹配到的JSON字符串 target_json_str = match_result.group() try: # 把JSON字符串转为Python字典 data_dict = json.loads(target_json_str) print("提取并解析成功!格式化后的数据:") print(json.dumps(data_dict, indent=2, ensure_ascii=False)) # 现在你可以像操作普通字典一样访问数据,比如 print(data_dict['delivery']) except json.JSONDecodeError as error: print(f"JSON解析失败,错误信息:{error}") else: print("没有找到匹配的JSON数据,请检查正则表达式或HTML内容")
几个关键说明:
- 为什么用
re.DOTALL? 你的目标JSON很可能是跨多行的,默认正则里的.不会匹配换行符,加上这个标志才能捕获完整的JSON块。 - 为什么优先用
r.text而不是str(soup)? BeautifulSoup在解析HTML时会自动调整标签结构、转义部分字符,可能会破坏原本能匹配的正则规则,直接用请求返回的原始文本更可靠。 - 异常处理的作用? 万一正则匹配到的内容不是合法JSON,或者没找到匹配,脚本不会直接崩溃,还能给出明确的错误提示。
你可以直接运行这个脚本,就能得到想要的Python字典了。
内容的提问来源于stack exchange,提问作者MarkWP




