python - 抓取并保存多个元素以在一个函数中列出
问题描述
我正在尝试创建一个存储以下键值对的整洁数组:
- cafename: "刮掉的名字"
- cafeaddress: "抓取地址"
- 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)
解决方案
字典{"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]
推荐阅读
- laravel - 如何添加前缀/后缀或修改 Audit - laravel 的 user_agent 值?
- javascript - 如何以角度更新对象内部的对象值
- google-cloud-platform - 从谷歌云运行容器到达 gmail 的问题
- compiler-construction - 如何在其他语言(不是 C++)中使用 LLVM 作为后端?
- python - 如何使用变量来调用类?
- django - plotly js中的破折号回调的等价物是什么
- javascript - JS - 拦截属性变化
- abap - 在同一个表上循环时二进制搜索不起作用
- python - df.apply() 中的熊猫错误仅适用于特定数据帧
- c - 如果我在 while 循环中的工作完成,有什么方法可以停止 (c = getchar()) != EOF) ?