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

我希望这里的人能够回答我认为是一个简单的问题。我是一个完全的新手,一直在尝试从网站 Archdaily 创建一个图像网络爬虫。经过多次调试后,下面是我的代码:


#### - Webscraping 0.1 alpha -

#### - Archdaily - 


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 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

在更改这些字符串值时我缺少一个步骤,但我不确定在哪里可以更改它们。希望有人能帮我解决这个问题,谢谢!


呼唤远方
浏览 122回答 3
3回答

GCT1015

这都是关于类型的。img_list实际上不是一个列表,而是一个字符串。您尝试调用它img_list()会导致错误。您有正确的想法,可以使用json.loads. 这里的错误非常简单——jsonData是一个列表,而不是字典。你有不止一张图片。您可以遍历列表。列表中的每个项目都是一个字典,您将能够url_large在列表中的每个字典中找到该属性:images_json = img.attrs['data-images']for image_properties in json.loads(images_json):&nbsp; &nbsp; print(image_properties['url_large'])

ITMISS

我也想更明确地说明我在您的代码中看到的内容。在这个特定的块中:img_list = img.attrs['data-images'] for k, v in img_list(): &nbsp; &nbsp;if k == 'url_large': &nbsp; &nbsp; &nbsp; &nbsp;print(v)有几个语法错误。如果“img_list”真的是一本字典,你就不能用这种方式遍历它。您需要在第二行使用 img_list.items() (对于 python3)或 img_list.iteritems() (python2)。当你像那样使用括号时,意味着你正在调用一个函数。但在这里,您正试图遍历字典。这就是为什么您会收到“不可调用”错误的原因。另一个主要问题是类型问题。simic0de 和 Infinity 解决了这个问题,但最终您需要检查 img_list 的类型并根据需要进行转换,以便您可以遍历它。

慕虎7371278

错误来源: img_list是一个字符串。您必须将其转换为列表 usingjson.loads并且它不会成为您必须循环的字典列表。工作解决方案:import jsonimport 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 img in json.loads(img_list):&nbsp; &nbsp; for k, v in img.items():&nbsp; &nbsp; &nbsp; &nbsp; if k == 'url_large':&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; print(v)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python