如何使用XPath提取以:开头的属性并获取其中的pzn、url值?
问题原因
你之前的XPath表达式报错,是因为属性名包含特殊字符:,不能直接用@":variants"的写法调用,需要通过属性名匹配的方式定位该属性。另外提取到的属性值是类JSON格式,不符合标准JSON规范,需要先做格式兼容处理才能解析。
解决步骤
1 正确提取:variants属性值
使用name()匹配属性名获取对应值:
variants_raw = response.xpath('.//div[contains(@class, "productAddToCartPanel")]//app-add-to-cart-form/@*[name()=":variants"]').extract_first()
2 处理非标准JSON格式
提取到的原始内容键无引号、值用单引号包裹,可通过字符串替换转成标准JSON:
import json # 替换单引号为双引号,给键名加双引号 variants_str = variants_raw.replace("'", '"').replace('pzn:', '"pzn":').replace('url:', '"url":').replace('packageSizeValue:', '"packageSizeValue":').replace('packageSizeUnit:', '"packageSizeUnit":').replace('sizeValue:', '"sizeValue":').replace('potency:', '"potency":') # 去掉末尾多余的逗号 variants_str = variants_str.rstrip(',') # 解析为Python列表 variants_list = json.loads(variants_str)
可选兼容方案:如果不想手动处理格式,可使用宽松JSON解析库demjson(需提前执行
pip install demjson安装):import demjson variants_list = demjson.decode(variants_raw)
3 提取pzn和url
遍历解析后的列表即可拿到对应值:
result = [] for item in variants_list: result.append({ "pzn": item["pzn"], "url": item["url"] }) print(result)
输出示例
[ {"pzn": "09900426", "url": "/online-kaufen/bio-h-tin-vit-h-25mg-4woc-tabletten-9900426"}, {"pzn": "09900432", "url": "/online-kaufen/bio-h-tin-vit-h-25mg-12wo-tabletten-9900432"}, {"pzn": "09900455", "url": "/online-kaufen/bio-h-tin-vit-h-25mg-2x12-tabletten-9900455"} ]
内容的提问来源于stack exchange,提问作者merlin
相关产品推荐
相关产品推荐

