如何使用Python BeautifulSoup爬取javascript/JSON混合内容?

问题描述 投票:0回答:1

我正在尝试从我的批发商网站抓取产品数据信息,该网站使用 Prestashop CMS 并使用混合的 JSON/Javascript 内容。 我用 python BeautifulSoup 和请求编写了一个脚本。 我知道这些不是处理 JS 的有效库,但我想由于网站的结构,我不需要使用 selenium。底部有一个标签,为我提供了我需要的所有信息。但是这里有一个问题,因为当我爬取类似json的代码块时,有javascript函数等。我开始学习python才5天,所以我什至不知道我的方法是否正确。我想解析 JSON 内容并将其放入数据库中。

这是我的代码片段,用于抓取数据并打印到屏幕;

https://codeshare.io/647ylz

这就是我得到的回应。

https://codeshare.io/mPMV34

感谢您阅读并花时间陪伴我。

我尝试使用正则表达式通过识别 {、}、[ 和 ] 等字符来匹配类似于 JSON 结构的模式,但没有成功。

python-3.x beautifulsoup web-crawler
1个回答
-1
投票

我尝试使用正则表达式通过识别 {、}、[ 和 ] 等字符来匹配类似于 JSON 结构的模式,但没有成功。

可能是因为

{}
可以嵌套,并且没有正则表达式能够匹配任意嵌套的
{}

好消息是您不需要任意深度!如果您知道嵌套层数永远不会超过 3 层,您可以编写与之匹配的模式:

import re, json
pattern = r'\{(?:[^{}]|NEST)+\}'
for i in range(3):
    pattern = pattern.replace('NEST', pattern)
matches = re.findall(pattern, script)
for match in matches:
    print(json.loads(match))

# {'id_attribute': '4196', 'id_attribute_group': '36', 'attribute': 'antartica_g', 'group': 'couleur'}
# {'id_attribute': '4197', 'id_attribute_group': '36', 'attribute': 'babe_pink', 'group': 'couleur'}
# {'id_attribute': '4201', 'id_attribute_group': '36', 'attribute': 'classic_black', 'group': 'couleur'}
# ...
# {'18268': {'attributes_values': {'36'...

未来的改进:

  • 处理
    json.loads
    上的错误,以防您匹配非 JSON 的内容
  • 验证您实际需要多少层嵌套
© www.soinside.com 2019 - 2024. All rights reserved.