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

使用BeautifulSoup爬取Snapple事实时遇'int'不可迭代TypeError

解决Snapple事实爬取脚本的TypeError问题

首先,咱们来拆解你遇到的问题和对应的解决方案:

错误原因分析

你的脚本报错TypeError: 'int' object is not iterable,核心问题出在循环遍历的逻辑错误,还有一些容易踩的小坑:

  1. 变量名混淆:你把BeautifulSoup导入为soup,接着又把解析后的页面实例赋值给了soup——虽然Python允许这么做,但很容易导致后续逻辑混乱(不过这不是本次报错的直接诱因)。
  2. 遍历对象错误:你通过for div in divs:遍历了id="facts"的div的所有子节点,这些子节点里包含了换行符、空格这类文本节点。当遍历到非标签节点时,div.find('li')可能返回非Tag类型的对象(比如int或者None),后续尝试迭代这个对象就会触发报错。
  3. 冗余嵌套与无存在性检查:多层嵌套循环没有做节点是否存在的判断,一旦某个节点找不到,直接操作会引发异常。

修正后的脚本

下面是调整后的代码,我会标注关键修改点:

from bs4 import BeautifulSoup as soup
import requests

# 获取页面内容
data = requests.get('https://www.snapple.com/real-facts')
result_list = []

# 重命名页面实例,避免覆盖BeautifulSoup别名
page_soup = soup(data.text, 'html.parser')

# 定位到存放事实的div
facts_div = page_soup.find("div", {'id':'facts'})

# 直接获取该div下所有的li元素(这才是存放事实的容器)
fact_items = facts_div.find_all('li')

for li in fact_items:
    # 找到每个li里的描述span
    desc_span = li.find('span', {'class':'description'})
    # 先判断节点是否存在,避免报错
    if desc_span:
        # 提取span里的a标签(事实文本在这里)
        fact_text_tag = desc_span.find('a')
        if fact_text_tag:
            # 获取标签内的文本,并去除多余空格换行
            fact_content = fact_text_tag.get_text(strip=True)
            result_list.append(fact_content)

# 打印整理后的结果
for idx, fact in enumerate(result_list, 1):
    print(f"Fact {idx}: {fact}")

关键修改说明

  • 变量名优化:把解析后的页面实例命名为page_soup,避免和导入的soup混淆。
  • 直接定位目标节点:用find_all('li')一次性获取所有事实项,跳过了无效的子节点遍历。
  • 存在性检查:每次查找节点后都做if判断,防止因节点不存在引发的异常。
  • 提取文本内容:用get_text(strip=True)获取干净的事实文本,而不是直接存储标签对象。

运行这个脚本后,你就能得到所有Snapple的真实事实内容啦~

内容的提问来源于stack exchange,提问作者Darki

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 10:38:11