使用BeautifulSoup爬取Snapple事实时遇'int'不可迭代TypeError
解决Snapple事实爬取脚本的TypeError问题
首先,咱们来拆解你遇到的问题和对应的解决方案:
错误原因分析
你的脚本报错TypeError: 'int' object is not iterable,核心问题出在循环遍历的逻辑错误,还有一些容易踩的小坑:
- 变量名混淆:你把
BeautifulSoup导入为soup,接着又把解析后的页面实例赋值给了soup——虽然Python允许这么做,但很容易导致后续逻辑混乱(不过这不是本次报错的直接诱因)。 - 遍历对象错误:你通过
for div in divs:遍历了id="facts"的div的所有子节点,这些子节点里包含了换行符、空格这类文本节点。当遍历到非标签节点时,div.find('li')可能返回非Tag类型的对象(比如int或者None),后续尝试迭代这个对象就会触发报错。 - 冗余嵌套与无存在性检查:多层嵌套循环没有做节点是否存在的判断,一旦某个节点找不到,直接操作会引发异常。
修正后的脚本
下面是调整后的代码,我会标注关键修改点:
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
相关产品推荐
相关产品推荐

