使用BeautifulSoup爬取Books to Scrape网站价格仅获取首个结果的技术求助
问题排查与解决
我来帮你分析下问题出在哪~
你当前代码的核心问题是使用了错误的查找逻辑:
soup.find_all("div", class_ = "col-sm-8 col-md-9")找到的是页面右侧的整个主内容区域,整个页面只有1个这样的div元素。- 接着在这个div里调用
i.find("p", class_ = "price_color"),而find()方法的特性是只返回第一个匹配到的元素,所以你只能拿到第一个图书的价格。
下面给你两种可行的修正方案,按需选择:
方案一:直接批量获取所有价格标签
因为页面中所有图书价格都带有统一的price_color类,我们可以直接定位所有这类标签,一次性拿到全部20个价格:
from bs4 import BeautifulSoup import requests URL = 'http://books.toscrape.com/catalogue/page-1.html' page = requests.get(URL) soup = BeautifulSoup(page.content, "html.parser") # 直接找到所有带price_color类的p标签 prices = soup.find_all("p", class_ = "price_color") for price in prices: print(price.text.strip())
方案二:按图书容器逐个提取价格(更推荐)
每个图书都包裹在class="product_pod"的<article>标签里,先定位所有图书的独立容器,再在每个容器内提取价格。这种方式更灵活,后续如果需要爬取书名、评分等其他信息,也能轻松扩展:
from bs4 import BeautifulSoup import requests URL = 'http://books.toscrape.com/catalogue/page-1.html' page = requests.get(URL) soup = BeautifulSoup(page.content, "html.parser") # 找到所有图书的容器 books = soup.find_all("article", class_ = "product_pod") for book in books: # 在单个图书容器内查找价格标签 price = book.find("p", class_ = "price_color") print(price.text.strip())
运行任意一种方案,你都能看到完整的20个图书价格啦~
内容的提问来源于stack exchange,提问作者f4r3
相关产品推荐
相关产品推荐

