如何使用 Beautiful Soup 正确提取网页中的所有分类链接
技术百科
心靈之曲
发布时间:2025-12-31
浏览: 次 本文详解为何 `find_all(class_="side_categories")` 返回单个 `
` 而非预期的链接列表,并提供两种可靠方法(css 选择器与嵌套 `find`/`find_all`)精准定位并提取图书网站的所有分类 url。当你调用 soup.find_all(class_="side_categories") 时,Beautiful Soup 确实返回了一个 ResultSet(本质是类列表对象),但它只包含一个匹配的 元素——因为整个页面中该 class 仅出现一次。这个 是分类导航的容器,而非你要的每个分类链接本身。因此你看到的是一个包裹了完整嵌套 HTML 的单元素列表,而非可直接遍历的 标签集合。 要获取所有分类链接(即 标签),需进一步在该容器内查找目标元素。以下是两种推荐做法: 通过以上任一方法,你将获得真正的可迭代链接列表,轻松完成后续数据采集任务。核心原则是:先定位容器,再聚焦目标;避免对容器本身调用 find_all,而应在容器内查找子元素。✅ 方法一:使用 CSS 选择器(推荐,简洁高效)
from bs4 import BeautifulSoup
import requests
url = "http://books.toscrape.com/"
page = requests.get(url)
soup = BeautifulSoup(page.text, "html.parser")
# 直接定位所有位于 .side_categories 内的 标签(层级更精确)
for link in soup.select('.side_categories li a'):
href = link.get('href')
if href: # 防止 None 值
full_url = url.rstrip('/') + '/' + href.lstrip('/')
print(full_url)✅ 方法二:链式查找(语义清晰,易理解)
# 先找到容器,再在其内部查找所有 标签
side_nav = soup.find(class_='side_categories')
if side_nav:
for link in side_nav.find_all('a'):
href = link.get('href')
if href:
full_url = url.rstrip('/') + '/' + href.lstrip('/')
print(full_url)⚠️ 注意事项:find() 返回单个 Tag 对象(或 None),而 find_all() 返回 ResultSet(可迭代);使用 select() 或 find_all() 时,务必确认选择器路径是否准确(如 .side_categories li a 表示“class 为 side_categories 的元素下的所有 li 中的 a”);处理 href 时建议做空值检查(link.get('href') 可能为 None),并规范化 URL 拼接(避免双斜杠 //);若需提取分类名称(如 “Travel”, “Mystery”),可用 link.get_text(strip=True) 替代 link.get('href')。
# 的是
# 你要
# 则是
# 链式
# 两种
# 而非
# 迭代
# css
# 选择器
# go
# 对象
# class
# html
# select
# 遍历
# href
# 容器内
# li
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- LINUX如何删除用户和用户组_Linux use
- Bpmn 2.0的XML文件怎么画流程图
- Win11怎么开启远程桌面_Win11系统远程桌面
- Win11如何设置系统声音_Win11系统声音调整
- Win11开机自检怎么关闭_跳过Win11开机磁盘
- Windows服务持续崩溃怎样修复_系统服务保护机
- Win11怎么关闭触控板_Win11笔记本禁用触摸
- Win11怎么连接蓝牙耳机_Win11蓝牙设备配对
- Python函数接口稳定性_版本演进解析【指导】
- c++ try_emplace用法_c++ map
- Go 语言标准库为何不提供泛型 Contains
- Mac如何查看电池健康百分比_Mac系统信息电源检
- Win11怎么关闭专注助手 Win11关闭免打扰模
- c++ stringstream用法详解_c++字
- 如何用正则与预处理高效拦截带干扰符的恶意域名
- Windows 11登录时提示“用户配置文件服务登
- Win11怎么关闭自动调节亮度_Windows11
- Win11怎么压缩文件 Win11自带压缩解压功能
- Windows服务无法启动错误1067是什么_进程
- Mac如何备份到iCloud_Mac桌面与文稿文件
- 如何使用Golang sync.Map实现并发安全
- 如何使用Golang反射创建map对象_动态生成键
- PHP 中如何在函数内持久化修改引用变量的指向
- Win11怎么更改文件夹图标_自定义Win11文件
- Mac如何创建和管理多个桌面空间_Mac高效多任务
- 如何在包含多值的列中精准搜索指定演员?
- php命令行怎么运行_通过CLI模式执行PHP脚本
- Win11怎么关闭自动调节亮度 Win11禁用内容
- Windows10电脑怎么查看硬盘通电时间_Win
- How to Properly Use NumPy
- Win11怎么打开旧版计算器_Win11恢复传统计
- php后缀怎么变mp4能播放_让php伪装mp4正
- Win11怎么更改账户头像_Windows 11自
- Go 语言标准库为何不提供泛型切片的 Contai
- 如何使用Golang table-driven f
- Win10怎样安装PPT模板_Win10安装PPT
- 如何在Golang中捕获JSON序列化错误_Gol
- Python并发安全问题_资源竞争说明【指导】
- Windows10系统更新错误0x80070002
- php能跑在stm32上吗_php在stm32微控
- Win11怎么设置虚拟键盘_打开Win11屏幕键盘
- Win10怎样清理C盘Steam游戏缓存_Win1
- php嵌入式日志记录怎么实现_php将硬件数据写入
- 如何在Golang中实现自定义Benchmark_
- Win11如何设置电源计划_Win11电源计划优化
- Win11色盲模式怎么开_Win11屏幕颜色滤镜设
- Windows10如何更改开机密码_Win10登录
- Win11怎么更改鼠标指针方案_Windows11
- C#如何使用Channel C#通道实现异步通信
- LINUX怎么进行文本内容搜索_Linux gre

QQ客服