如何将json数据从HTML提取到python字典中?

时间:2020-04-16 20:02:47

标签: 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': '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>

错误消息是:

>>> 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.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'
>>>

如何将产品数据提取到python字典中?

1 个答案:

答案 0 :(得分:1)

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

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

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

问题:

  1. 此数据为原始。您不应直接将其传递给json.loads,以解决此尝试通过正则表达式或某些字符串插值从字符串中获取{'event' .... }的问题。例如,如果您的数据格式总是这样,而其他JavaScript并未通过{}在范围内定义,则获取前{和后}的索引,并执行子字符串以获取主要数据。
    1. 此数据包含'作为字符串指示符,但json标准使用双引号"。您还应该注意更换它们。

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