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
相关产品推荐
相关产品推荐

