使用Beautiful Soup的find_all未返回预期列表结构的问题求助
问题分析与解决
你的核心问题是定位元素的层级错误:
- 你调用
soup.find_all(class_="side_categories")获取的是包含所有分类的外层<div>容器,而非分类对应的<a>元素,所以返回的是div集合,无法直接遍历分类内容。 - 官方示例中
soup.find_all("a")是直接定位所有独立的<a>标签,和你的定位逻辑完全不同。
修正方案
方案1:先取容器再定位内部标签
因为页面中只有一个side_categories容器,用find()替代find_all()更高效,再在容器内获取所有分类<a>标签:
from bs4 import BeautifulSoup import requests url = "http://books.toscrape.com/" page = requests.get(url) soup = BeautifulSoup(page.text, "html.parser") # 获取分类容器 category_container = soup.find(class_="side_categories") # 从容器中提取所有分类a标签 categories = category_container.find_all("a") # 遍历分类 for cat in categories: # 清理分类名称的空格 cat_name = cat.get_text(strip=True) # 拼接完整分类链接(原站是相对路径) cat_link = url + cat["href"] print(f"{cat_name}: {cat_link}")
方案2:直接用CSS选择器定位目标标签
用CSS选择器可以一步定位到side_categories容器下的所有<a>标签,代码更简洁:
from bs4 import BeautifulSoup import requests url = "http://books.toscrape.com/" page = requests.get(url) soup = BeautifulSoup(page.text, "html.parser") # 直接定位目标a标签 categories = soup.select(".side_categories a") # 遍历处理 for cat in categories: cat_name = cat.get_text(strip=True) cat_link = url + cat["href"] print(f"{cat_name}: {cat_link}")
两种方案都能得到和官方示例类似的独立<a>元素列表,可直接遍历处理分类内容。
内容的提问来源于stack exchange,提问作者Funlamb
相关产品推荐
相关产品推荐

