如何将 BeautifulSoup 标签转换为 JSON?

Posted

技术标签:

【中文标题】如何将 BeautifulSoup 标签转换为 JSON?【英文标题】:How to convert a BeautifulSoup tag to JSON? 【发布时间】:2020-04-27 03:13:18 【问题描述】:

我有一个类型元素,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)) 类型,它抛出了异常:'JSONDecodeError: Expecting value: line 1 column 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))))

【问题讨论】:

var gbProductDetailsSsrData 后面的结构是否总是相同的?因为在这种情况下您可以使用re 包来检索数据。 你需要找到第一个和最后一个加上1。然后将whitespace\n 替换为空白"" 然后就可以开始加载了! 【参考方案1】:

您可以使用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

【讨论】:

感谢您提供正则表达式。很高兴有一个可以在任何脚本中获取任何对象。打得好!【参考方案2】:

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

此外,Javascript 不是 JSON,因此 JS sn-p 成为有效 json 的可能性至少可以说是很小的。测试它的正确语法与您用于第一个用例的语法完全相同,即json.loads(script.text),但我认为这是您尝试的第一件事;-)

所以,好吧,恐怕您必须手动解析此脚本以提取相关部分。根据 js 代码的样子,可能是几行基本字符串解析/正则表达式的问题,或者可能需要适当的 Javascript 解析器等。

【讨论】:

我已尝试发布输出,但它超出了允许的字符数

以上是关于如何将 BeautifulSoup 标签转换为 JSON?的主要内容,如果未能解决你的问题,请参考以下文章

如何将此 XPath 表达式转换为 BeautifulSoup?

将 XPath 转换为美丽的汤

如何将从 Chrome 复制的 css 选择器路径转换为 ​​beautifulsoup 对象?

Beautifulsoup4

beautifulsoup 对象如何能够将标签作为属性?

有没有办法使用 BeautifulSoup 将数据从列表正确转换为 CSV 文件?