首页 > 解决方案 > 抓取并保存多个元素以在一个函数中列出

问题描述

我正在尝试创建一个存储以下键值对的整洁数组:

  1. cafename: "刮掉的名字"
  2. cafeaddress: "抓取地址"
  3. cafedescription:“刮掉的描述”

我编写的代码可以在作为单独的函数运行时刮掉这些元素中的每一个(因此每个函数刮掉一个元素 = 3 个函数)。但是现在我正试图通过一个函数来减少重复次数,该函数可以抓取所有 3 件事,然后将它们附加到列表中。

现在,当我尝试使用下面的代码时,它只返回描述,这是cafes_container = soup_cafes.findAll(attrs={"class": "venue-title", "class": "address-content", "class": "venue-description"})脚本行中的最后一个元素。

整个代码块是这样的:

def cafes():
    url = 'https://www.broadsheet.com.au/melbourne/guides/best-cafes-thornbury'
    response = requests.get(url, timeout=5)

    soup_cafes = BeautifulSoup(response.content, "html.parser")
    type(soup_cafes)

    cafes_container = soup_cafes.findAll(attrs={"class": "venue-title", "class": "address-content", "class": "venue-description"})
    
    cafes = []
    for container in cafes_container:
        cafes.append(container.text)

    return(cafes)

标签: pythonlistdictionaryweb-scraping

解决方案


字典{"class":"venue-title", "class":"address-content", "class":"venue-description"}相当于{"class":"venue-description"}. 这应该不足为奇,因为字典的全部意义在于拥有唯一的键。每个字面量定义只是覆盖之前的值。事实上,你观察到了这种确切的行为。

您可以通过一遍又一遍地在字典中设置值来利用它:

cafe_classes = ["venue-title", "address-content", "venue-description"]

cafes = []
for cafe_class in cafe_classes:
    cafes.append(soup_cafes.find(attrs={"class": cafe_class}).text)

在这一点上,理解可能更容易阅读和编写:

cafe_classes = ["venue-title", "address-content", "venue-description"]
cafes = [soup_cafes.find(attrs={"class": c}).text for c in cafe_classes]

推荐阅读