如何将json数据从HTML拉入python字典?

如何将json数据从HTML拉入python字典?,python,json,Python,Json,我试图在html页面内的json语句中提取结构化数据。因此,我检索html并通过xpath获取json: json.loads(response.xpath('//*[@id="product"]/script[2]/text()').extract_first()) 数据是这样开始的: response.xpath('//*[@id="product"]/script[2]/text()').extract_first() "\r\ndataLayer.push({\r\n\t'event'

我试图在html页面内的json语句中提取结构化数据。因此,我检索html并通过xpath获取json:

json.loads(response.xpath('//*[@id="product"]/script[2]/text()').extract_first())
数据是这样开始的:

response.xpath('//*[@id="product"]/script[2]/text()').extract_first()
"\r\ndataLayer.push({\r\n\t'event': 'EECproductDetailView',\r\n\t'ecommerce': {\r\n\t\t'detail': {\r\n\r\n\t\t\t'products': [{\r\n\t\t\t\t'id': '14171171',\r\n\t\t\t\t'name': 'Gingium 120mg',\r\n\t\t\t\t'price': '27.9',\r\n\r\n\t\t\t\t'brand': 'Hexal AG',\r\n\r\n\r\n\t\t\t\t'variant': 'Filmtabletten, 60 Stück, N2',\r\n\r\n\r\n\t\t\t\t'category': 'gedaechtnis-konzentration'\r\n\t\t\t}]\r\n\t\t}\r\n\t}\r\n});\r\n"
结构化json示例:

<script>
dataLayer.push({
    'event': 'EECproductDetailView',
    'ecommerce': {
        'detail': {

            'products': [{
                'id': '14122171',
                'name': 'test',
                'price': '27.9'
            }]
        }
    }
});
</script>

数据层推送({
“事件”:“EECproductDetailView”,
“电子商务”:{
“细节”:{
“产品”:[{
“id”:“14122171”,
“名称”:“测试”,
‘价格’:‘27.9’
}]
}
}
});
错误消息是:

>>> json.loads(response.xpath('//*[@id="product"]/script[2]/text()').extract_first())
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/usr/local/Cellar/python/3.7.1/Frameworks/Python.framework/Versions/3.7/lib/python3.7/json/__init__.py", line 348, in loads
    return _default_decoder.decode(s)
  File "/usr/local/Cellar/python/3.7.1/Frameworks/Python.framework/Versions/3.7/lib/python3.7/json/decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/local/Cellar/python/3.7.1/Frameworks/Python.framework/Versions/3.7/lib/python3.7/json/decoder.py", line 355, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 2 column 1 (char 2)
>>json.load(response.xpath('/*[@id=“product”]/script[2]/text()).extract_first())
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/usr/local/ceral/python/3.7.1/Frameworks/python.framework/Versions/3.7/lib/python3.7/json/_init__.py”,第348行,在loads中
返回\u默认\u解码器。解码
文件“/usr/local/ceral/python/3.7.1/Frameworks/python.framework/Versions/3.7/lib/python3.7/json/decoder.py”,第337行,在decode中
obj,end=self.raw\u decode(s,idx=\u w(s,0.end())
文件“/usr/local/ceral/python/3.7.1/Frameworks/python.framework/Versions/3.7/lib/python3.7/json/decoder.py”,第355行,原始解码
从None引发JSONDecodeError(“预期值”,s,err.value)
json.decoder.JSONDecodeError:预期值:第2行第1列(字符2)
我还试图解码:

>>> json.loads(response.xpath('//*[@id="product"]/script[2]/text()').extract_first().decode("utf-8"))
Traceback (most recent call last):
  File "<console>", line 1, in <module>
AttributeError: 'str' object has no attribute 'decode'
>>>
>>json.load(response.xpath('/*[@id=“product”]/script[2]/text()).extract_first().decode(“utf-8”))
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
AttributeError:“str”对象没有属性“decode”
>>>

如何将产品数据拉入python字典?

您的方法中存在许多问题,我将在下面讨论这些问题。您希望将传递给push函数的值解析为json,并将其作为输入:

dataLayer.push({
“事件”:“EECproductDetailView”,
“电子商务”:{
“细节”:{
“产品”:[{
“id”:“14122171”,
“名称”:“测试”,
‘价格’:‘27.9’
}]
}
}
});
问题:

  • 此数据为原始数据。不应将其直接传递给
    json.loads
    ,若要解决此问题,请尝试通过正则表达式或某些字符串插值从字符串中获取
    {'event'..}
    。例如,如果您的数据格式总是这样,并且其他Java脚本没有通过
    {}
    在作用域中定义,那么获取第一个
    {
    和最后一个
    }
    的索引,并执行子字符串以获取主数据。
  • 此数据包含
    作为字符串指示符,但json标准使用双引号
    。您也应该注意替换它们

  • 解决问题后,您可以使用
    json.loads
    来解析您的输入。

    看看这个谢谢,抱歉,我认为我没有问正确的问题。编辑问题以使问题更清楚。谢谢。这帮助我获得了值。我使用:re.findall(r)(?