为了账号安全,请及时绑定邮箱和手机立即绑定

网络抓取后无法从字典中检索值

网络抓取后无法从字典中检索值

呼唤远方 2023-01-04 15:35:53
我希望这里的人能够回答我认为是一个简单的问题。我是一个完全的新手,一直在尝试从网站 Archdaily 创建一个图像网络爬虫。经过多次调试后,下面是我的代码:#### - Webscraping 0.1 alpha -#### - Archdaily - import requestsfrom bs4 import BeautifulSoup# Enter the URL of the webpage you want to download the images frompage = 'https://www.archdaily.com/63267/ad-classics-house-vi-peter-eisenman/5037e0ec28ba0d599b000190-ad-classics-house-vi-peter-eisenman-image'# Returns the webpage source code under page_docresult = requests.get(page)page_doc = result.content# Returns the source code as BeautifulSoup object, as nested data structuresoup = BeautifulSoup(page_doc, 'html.parser')img = soup.find('div', class_='afd-gal-items')img_list = img.attrs['data-images']for k, v in img_list():    if k == 'url_large':        print(v)这些元素在这里:img = soup.find('div', class_='afd-gal-items')img_list = img.attrs['data-images']尝试隔离 data-images 属性,如下所示:这部分我github上传,很长如您所见,或者我在这里完全错了,我尝试从这个最终字典列表中调用“url_large”值时出现了 TypeError,如下所示:Traceback (most recent call last):  File "D:/Python/Programs/Webscraper/Webscraping v0.2alpha.py", line 23, in <module>    for k, v in img_list():TypeError: 'str' object is not callable我相信我的错误在于由此产生的“数据图像”隔离,对我来说它看起来像列表中的字典,因为它们被方括号和大括号括起来。我在这里完全不适应,因为我基本上是盲目地进入这个项目的(甚至还没有读过 Guttag 的书的第 4 章)。我也到处寻找想法,并试图模仿我发现的东西。我发现其他人之前提供的将数据更改为 JSON 数据的解决方案,所以我找到了以下代码:jsonData = json.loads(img.attrs['data-images'])print(jsonData['url_large'])但这是一个半身像,如下所示:Traceback (most recent call last):  File "D:/Python/Programs/Webscraper/Webscraping v0.2alpha.py", line 29, in <module>    print(jsonData['url_large'])TypeError: list indices must be integers or slices, not str在更改这些字符串值时我缺少一个步骤,但我不确定在哪里可以更改它们。希望有人能帮我解决这个问题,谢谢!
查看完整描述

3 回答

?
GCT1015

TA贡献1827条经验 获得超4个赞

这都是关于类型的。


img_list实际上不是一个列表,而是一个字符串。您尝试调用它img_list()会导致错误。


您有正确的想法,可以使用json.loads. 这里的错误非常简单——jsonData是一个列表,而不是字典。你有不止一张图片。


您可以遍历列表。列表中的每个项目都是一个字典,您将能够url_large在列表中的每个字典中找到该属性:


images_json = img.attrs['data-images']

for image_properties in json.loads(images_json):

    print(image_properties['url_large'])


查看完整回答
反对 回复 2023-01-04
?
ITMISS

TA贡献1871条经验 获得超8个赞

我也想更明确地说明我在您的代码中看到的内容。

在这个特定的块中:

img_list = img.attrs['data-images'] for k, v in img_list():    if k == 'url_large':        print(v)

有几个语法错误。如果“img_list”真的是一本字典,你就不能用这种方式遍历它。您需要在第二行使用 img_list.items() (对于 python3)或 img_list.iteritems() (python2)。

当你像那样使用括号时,意味着你正在调用一个函数。但在这里,您正试图遍历字典。这就是为什么您会收到“不可调用”错误的原因。

另一个主要问题是类型问题。simic0de 和 Infinity 解决了这个问题,但最终您需要检查 img_list 的类型并根据需要进行转换,以便您可以遍历它。


查看完整回答
反对 回复 2023-01-04
?
慕虎7371278

TA贡献1802条经验 获得超4个赞

错误来源: img_list是一个字符串。您必须将其转换为列表 usingjson.loads并且它不会成为您必须循环的字典列表。


工作解决方案:


import json

import requests

from bs4 import BeautifulSoup


# Enter the URL of the webpage you want to download the images from

page = 'https://www.archdaily.com/63267/ad-classics-house-vi-peter-eisenman/5037e0ec28ba0d599b000190-ad-classics-house-vi-peter-eisenman-image'


# Returns the webpage source code under page_doc

result = requests.get(page)

page_doc = result.content


# Returns the source code as BeautifulSoup object, as nested data structure

soup = BeautifulSoup(page_doc, 'html.parser')

img = soup.find('div', class_='afd-gal-items')

img_list = img.attrs['data-images']

for img in json.loads(img_list):

    for k, v in img.items():

        if k == 'url_large':

            print(v)


查看完整回答
反对 回复 2023-01-04
  • 3 回答
  • 0 关注
  • 121 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信