You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Webscraping场景下如何向列表单行追加多个食谱关联标签

问题解决说明

你当前代码存在两个核心问题:

  1. 数据结构设计不合理:用两个独立的一维列表存储食谱标题和标签,无法建立单个食谱和其多个标签的一对多对应关系,多个标签会被平铺到全局的key列表里,自然没法和对应食谱绑定。
  2. 缩进错误:遍历每篇食谱的for r in recipes:循环写在了翻页循环的外层,只会处理最后一页抓取到的食谱数据,前面页的内容都会被覆盖丢失。

修正方案

用一个列表统一存储所有食谱信息,每个元素包含当前食谱的标题和对应的标签列表,每次处理单个食谱时先收集该食谱的所有标签,再统一存入总列表即可。修正后代码如下:

import requests
from bs4 import BeautifulSoup
from time import sleep
from random import randint

# 统一存储所有食谱信息,每个元素为 [标题, 标签列表]
recipes_data = []
pages = [1,2,3] # 按需替换成你要爬取的页码范围

for page_num in pages:
    page = requests.get(f'https://www.skinnytaste.com/page/{page_num}/') 
    soup = BeautifulSoup(page.text, 'html.parser')
    # 合并奇偶类的文章
    recipes = soup.find_all('article', class_='post teaser-post odd')
    recipes.extend(soup.find_all('article', class_='post teaser-post even'))
    sleep(randint(2, 8)) 

    # 注意缩进:单页食谱遍历要放在翻页循环内部
    for r in recipes:
        # 获取当前食谱标题
        title = r.h2.text.strip()
        # 初始化当前食谱的标签列表
        current_tags = []
        
        post_meta = r.find('div', class_='post-meta')                                             
        icons = post_meta.find('div', class_='icons')
        if icons is not None:
            keys = icons.find_all('span')
            for k in keys:
                tag = k.find('a').find('img').get('alt').strip()
                current_tags.append(tag)
        
        # 将当前食谱的标题和对应标签存入总列表
        recipes_data.append([title, current_tags])

# 后续使用示例:将同一食谱的所有标签合并为字符串输出
for item in recipes_data:
    print(f"食谱:{item[0]},标签:{'、'.join(item[1])}")

如果你需要导出为表格,直接把每个元素的标签列表用分隔符拼接后放在同一单元格即可。


内容的提问来源于stack exchange,提问作者yo doggy dogg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 04:36:00