用漂亮的汤刮擦JSON对象

时间:2020-03-01 21:16:59

标签: python json beautifulsoup

背景

我正在尝试刮擦此page。基本上得到每个产品的名称,价格和图像。我原本希望看到汤中包含产品的div,但我没有。因此,我要做的是在chrome浏览器中打开了网址,并在“网络”标签中执行了inspect元素后,我发现它正在进行的GET调用直接与此page进行,以获取所有与产品相关的信息。如果您打开该网址,则基本上会看到一个JSON对象,并且其中有html字符串以及产品和价格的div。对我来说,问题是我该如何解析?

尝试的解决方案 我认为一种显而易见的方法是将汤转换为JSON,因此,要使汤成为字符串,这正是我所做的。现在的问题是我的json_data变量基本上有一个字符串。因此,当我尝试执行类似json_data['Results']的操作时,它给了我错误提示我只能传递整数。我不确定如何进一步进行。

如果我做错了事,我会喜欢建议和任何指点。

以下是我的代码

from bs4 import BeautifulSoup
from random_user_agent.user_agent import UserAgent
from random_user_agent.params import SoftwareName, OperatingSystem
import requests
import json
import sys


sys.stdout = open('output.html', 'wt')
page_to_scrape = 'https://shop.guess.com/en/catalog/browse/men/tanks-t-shirts/view-all/?filter=true&page=1'
software_names = [SoftwareName.CHROME.value]
operating_systems = [OperatingSystem.WINDOWS.value, OperatingSystem.LINUX.value]
user_agent_rotator = UserAgent(software_names=software_names, operating_systems=operating_systems, limit=100)
page = requests.get(page_to_scrape, headers={'User-Agent': user_agent_rotator.get_random_user_agent()})
soup = BeautifulSoup(page.content, "html.parser")
json_data = json.dumps(str(soup))
print(json_data)

1 个答案:

答案 0 :(得分:2)

错误可能是json_data是一个字符串而不是字典类型,因为json.dumps(str(soup))返回一个字符串。由于json_data是字符串,所以我们不能做json_data['Results']并且访问字符串的任何元素,我们需要传递索引,从而传递错误。

编辑

要从响应中获取Results,代码如下所示:

json_data = json.loads(str(soup.text))
print(json_data['Results'])

让我知道这是否有帮助!