Webscraping场景下如何向列表单行追加多个食谱关联标签
问题解决说明
你当前代码存在两个核心问题:
- 数据结构设计不合理:用两个独立的一维列表存储食谱标题和标签,无法建立单个食谱和其多个标签的一对多对应关系,多个标签会被平铺到全局的key列表里,自然没法和对应食谱绑定。
- 缩进错误:遍历每篇食谱的
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
相关产品推荐
相关产品推荐

