我有一个类型元素,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))))
BS4不解析javascript,从BS4的
Tag
对象的POV来看,<script>
标记中的文本就是文本。我不知道这个脚本是什么样子的(因为你没有发布它,我也不想费心去寻找它),但是如果你的期望是script ['goodsInfo']
会返回一个名为“goodInfo”的JS变量的值,那么,坏消息是,它不会以这种方式工作另外,Javascript不是JSON,所以JS片段成为有效JSON的可能性很小。测试它的正确语法与您在第一个用例中使用的语法非常简单,即
json.loads(script.text)
,但我认为这是您尝试的第一件事;-)因此,恐怕您必须手动解析此脚本以提取相关部分。根据js代码的外观,可能需要几行基本的字符串解析/regexp内容,也可能需要一个合适的Javascript解析器等
您可以使用
json
模块来提取数据,但首先必须找到正确的信息-您可以使用re
模块来提取数据例如:
印刷品:
相关问题 更多 >
编程相关推荐