如何从HTML内嵌JSON中提取指定层级family.products.edges下的uri
别用正则解析JSON!用Python的json模块精准定位指定层级
正则处理嵌套的JSON结构真的是给自己挖坑——你永远不知道什么时候会遇到转义字符、嵌套层级变化或者格式小变动导致匹配失效。针对你的需求,用Python内置的json模块解析,再定位到指定层级提取URI才是靠谱的方案,具体步骤如下:
步骤1:清理并解析HTML中的JSON字符串
你拿到的是内嵌在HTML里的转义JSON(用"代替双引号),首先要把它转换成合法的JSON格式,再解析成Python字典:
import json # 假设你的test变量是包含转义JSON的字符串 clean_json = test.replace('"', '"') try: data = json.loads(clean_json) except json.JSONDecodeError as e: print(f"JSON解析出错:{e}") exit()
步骤2:定位到family -> products -> edges层级提取URI
根据你描述的结构,我们遍历edges数组,提取符合条件的URI,并且只取前5条:
target_uris = [] # 逐层获取目标层级,用get()避免键不存在报错 products_edges = data.get("family", {}).get("products", {}).get("edges", []) for edge in products_edges: # 注意:GraphQL的edges结构通常是{"node": {...}},如果你的结构直接在edge里有uri,改成edge.get("uri")即可 product_uri = edge.get("node", {}).get("uri") # 过滤符合要求的URI:包含www.barrythrill.se且以.html结尾 if product_uri and "www.barrythrill.se" in product_uri and product_uri.endswith(".html"): target_uris.append(product_uri) # 取够5条就停止循环 if len(target_uris) == 5: break # 输出结果 print(target_uris)
为什么不推荐正则?
- JSON的嵌套结构、转义字符(比如字符串里的
\")会让正则表达式变得异常复杂,很容易匹配到非目标层级的URI; - 如果JSON格式有微小变动(比如空格、键的顺序变化),正则就可能失效,而
json模块完全不受这些格式细节影响; - 代码可读性和可维护性远高于冗长的正则表达式。
内容的提问来源于stack exchange,提问作者PythonNewbie
相关产品推荐
相关产品推荐

