如何将BeautifulSoup标记转换为JSON?

2024-05-19 22:47:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个类型元素,bs4.element.Tag,是网页抓取的产物,我通常会:json.loads (soup.find ('script', type = 'application / ld + json'). Text),但在这个页面上它只出现在:<script> </script>中,所以我必须做:scripts = soup.find_all ('script'),直到找到我感兴趣的:script = scripts [18]

所讨论的变量是script。我的问题是,我想访问它的属性,例如script ['goodsInfo'],显然是元素类型bs4.element.Tag,尝试执行:script.attrs并返回我{}。然后我尝试将其转换为类型json: json.loads (str (script)),它向我抛出了异常:“jsondecoderError:期望值:第1行第1列(char 0)”

这是我的代码:

import json
from bs4 import BeautifulSoup
import requests
url_aux = 'https://www.shein.com/Mock-neck-Brush-Stroke-Print-Bodycon-Dress-p-941649-cat-1727.html?scici=navbar_2~~tab01navbar04~~4~~real_1727~~~~0~~0'

response = requests.get(url_aux)
soup = BeautifulSoup(response.content, "html.parser")

scripts = soup.find_all('script')
script = scripts[18]

print(json.loads(str(script)))
#output: JSONDecodeError: Expecting value: line 1 column 1 (char 0)

print(type(script))
#output: bs4.element.Tag

print(str(json.loads(str(script))))

Tags: importjson元素类型tagtypescriptsscript
2条回答

BS4不解析javascript,从BS4的Tag对象的POV来看,<script>标记中的文本就是文本。我不知道这个脚本是什么样子的(因为你没有发布它,我也不想费心去寻找它),但是如果你的期望是script ['goodsInfo']会返回一个名为“goodInfo”的JS变量的值,那么,坏消息是,它不会以这种方式工作

另外,Javascript不是JSON,所以JS片段成为有效JSON的可能性很小。测试它的正确语法与您在第一个用例中使用的语法非常简单,即json.loads(script.text),但我认为这是您尝试的第一件事;-)

因此,恐怕您必须手动解析此脚本以提取相关部分。根据js代码的外观,可能需要几行基本的字符串解析/regexp内容,也可能需要一个合适的Javascript解析器等

您可以使用json模块来提取数据,但首先必须找到正确的信息-您可以使用re模块来提取数据

例如:

import re
import json
import requests

url = 'https://eur.shein.com/Mock-neck-Brush-Stroke-Print-Bodycon-Dress-p-941649-cat-1727.html?scici=navbar_2~~tab01navbar04~~4~~real_1727~~~~0~~0&ref=www&rep=dir&ret=eur'

txt = re.findall(r'goodsInfo\s*:\s*({.*})', requests.get(url).text)[0]

data = json.loads(txt)

# print(json.dumps(data, indent=4)) # <  uncomment to see all data

print(data['detail']['goods_name'])
print(data['detail']['brand'])
print('Num of comments:', data['detail']['comment']['comment_num'])

印刷品:

Mock-neck Brush Stroke Print Bodycon Dress
SHEIN
Num of comments: 17

相关问题 更多 >