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

Python BeautifulSoup爬虫for循环仅执行首次迭代如何解决

问题原因

你的代码仅能输出第一本书的信息、循环没有按预期遍历所有条目,核心是元素选择逻辑存在两处错误:

  • 你通过find_all('ol', class_='row')获取的是所有书籍的外层父容器,整个目标页面只有1个符合该规则的<ol>标签,因此section是长度为1的列表,外层for循环天然只会执行1次。
  • 循环内部你使用find()方法查找书籍条目和价格元素,find()只会返回当前节点下第一个匹配的子元素,不会遍历所有书籍节点,自然拿不到后续条目内容。
修复方法

调整选择器逻辑:先定位到唯一的书籍列表容器,再抓取容器下所有代表单本书的<article class="product_pod">元素,遍历这个书籍列表完成数据提取即可。

修复后的完整代码:

from bs4 import BeautifulSoup
import requests
import json

url = 'http://books.toscrape.com/'
page = requests.get(url)

html = BeautifulSoup(page.content, 'html.parser')
# 定位唯一的外层书籍列表容器
book_container = html.find('ol', class_='row')
# 抓取容器下所有单本书的条目,作为实际遍历对象
all_books = book_container.find_all("article", class_='product_pod')

for book in all_books:
    # 提取标题
    title = book.img['alt']

    # 提取价格
    price_element = book.find(class_='price_color')
    price = price_element.text[1:]

    # 生成JSON结果
    final_result = json.dumps({"Title":title, "Price":price}, sort_keys=True, indent=1, ensure_ascii=False)

    print(title)
    print(price)
    print()
    print(final_result)

补充说明:BeautifulSoup中find()返回首个匹配的单个元素,find_all()返回所有匹配元素组成的可遍历列表,写爬取逻辑时要先确认你遍历的集合确实包含了所有目标条目,不要把外层容器当成遍历对象。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 20:27:20