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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 21:12:36