
上一篇我们用requests把网页源码拿下来了。但拿到手的是什么一大坨 HTML 标签尖括号套尖括号密密麻麻的。你想要的标题、链接、价格、正文全混在里面。总不能手动一条条复制粘贴吧那也太蠢了。今天的主角BeautifulSoup就是专门干这个的——从一堆 HTML 里精准把你想要的数据抠出来。BeautifulSoup 是什么一句话说清楚它是一个 HTML/XML 解析库能帮你从网页源码里精准提取你想要的内容。打个比方requests是帮你把整棵树网页搬回家的人而BeautifulSoup是帮你从树上摘果子的人。一个负责拿回来一个负责挑出来。它不下载网页它只负责解析。安装打开终端输入pipinstallbeautifulsoup4注意是beautifulsoup4不是beautifulsoup。后者是老版本没人用了。另外建议再装一个解析器pipinstalllxmllxml解析速度快功能强BeautifulSoup 可以直接用它当底层解析器。基本用法第一步导入和初始化frombs4importBeautifulSoup# 假设 html 是你用 requests 拿到的网页源码soupBeautifulSoup(html,lxml)就两行。第一行把库引进来第二行把 HTML 字符串丢进去解析得到一个soup对象。后面所有提取操作都基于这个对象。find —— 找第一个元素如果你只想找页面上第一个h1标签titlesoup.find(h1)print(title)# h1这是标题/h1find只会返回第一个匹配的元素。页面上有十个 h1 它也只给你第一个。find_all —— 找所有元素如果你想找页面上所有的a标签也就是所有链接linkssoup.find_all(a)print(links)# [a hrefxxx链接1/a, a hrefyyy链接2/a, ...]find_all返回的是一个列表里面装着所有匹配的元素。通过属性找元素光靠标签名不够精准。页面上可能有几十个div但你要的只是 class 为book-item的那几个。按 class 找# 注意是 class_不是 classitemsoup.find(div,class_book-item)为什么是class_不是class因为class在 Python 里是定义类的关键字不能当参数名用。加个下划线就绕开了。按 id 找contentsoup.find(idmain-content)id 不用加下划线因为 id 不是 Python 的关键字。同时指定多个属性itemsoup.find(div,class_book-item,idbook-1)条件越多定位越精准。提取文本内容找到元素之后怎么拿到里面的文字titlesoup.find(h1)# 方法一.textprint(title.text)# 这是标题# 方法二.get_text()print(title.get_text())# 这是标题两种都能用效果差不多。.get_text()支持更多参数可以控制分隔符、要不要去空白之类的。日常用.text就行。提取属性值比如你找到了一个a标签想拿到它的href链接地址linksoup.find(a)# 方法一用方括号print(link[href])# https://example.com# 方法二用 .get()print(link.get(href))# https://example.com推荐用.get()。为什么因为如果属性不存在方括号的方式会直接报错崩溃而.get()会返回None程序还能继续跑。写爬虫的原则是宁可不拿数据也不能崩了。CSS 选择器select()除了find和find_allBeautifulSoup 还支持 CSS 选择器用select()方法。如果你写过 CSS简直无缝衔接。按 class 选前面加个点# 选出所有 classbook-item 的元素itemssoup.select(.book-item)按 id 选前面加个井号# 选出 idmain 的元素mainsoup.select(#main)组合使用# 选出 classbook-list 下面的所有 libookssoup.select(.book-list li)# 选出 classtitle 的 h3titlessoup.select(h3.title)select()返回的永远是列表哪怕只有一个结果。如果你只要第一个可以用select_one()first_titlesoup.select_one(.book-title)简单的提取用find/find_all复杂的层级关系用select怎么顺手怎么来。实战案例提取书籍列表光说不练假把式我们来搞一个完整的例子。假设我们有这样一个书籍列表页面htmlheadtitle梅雅达书店/title/headbodyh1畅销书籍列表/h1divclassbook-listdivclassbook-itemh3classbook-titlePython编程从入门到实践/h3pclassbook-author作者埃里克·马瑟斯/ppclassbook-price价格¥89.00/ppclassbook-desc一本适合初学者的Python经典入门书。/pahref/books/1classbook-link查看详情/a/divdivclassbook-itemh3classbook-title流畅的Python/h3pclassbook-author作者卢西亚诺·拉马略/ppclassbook-price价格¥139.00/ppclassbook-descPython进阶必读深入理解Python语言特性。/pahref/books/2classbook-link查看详情/a/divdivclassbook-itemh3classbook-title算法图解/h3pclassbook-author作者阿德南·巴哈伊/ppclassbook-price价格¥69.00/ppclassbook-desc像小说一样有趣的算法入门书。/pahref/books/3classbook-link查看详情/a/div/div/body/html现在我们要把所有书名和链接提取出来。frombs4importBeautifulSoup soupBeautifulSoup(html_doc,lxml)# 找到所有书籍项book_itemssoup.find_all(div,class_book-item)# 遍历每一本书提取书名和链接foriteminbook_items:titleitem.find(h3,class_book-title).text linkitem.find(a,class_book-link).get(href)print(f书名{title})print(f链接{link})print(---)运行结果书名Python编程从入门到实践 链接/books/1 --- 书名流畅的Python 链接/books/2 --- 书名算法图解 链接/books/3 ---搞定。三本书的信息全部提取出来了。想加作者和价格照着同样的思路多加两行find就行。新手最容易踩的三个坑坑1class 写成 class报错了# ❌ 错的soup.find(div,classitem)# ✅ 对的soup.find(div,class_item)这个 90% 的新手都踩过。看到SyntaxError: invalid syntax先检查是不是把class_写成class了。坑2find 找不到直接 .text 崩溃titlesoup.find(h1)print(title.text)# 如果页面上没有 h1title 是 None直接崩安全写法先判断再用。titlesoup.find(h1)iftitle:print(title.text)else:print(没找到标题)写爬虫要有找不到是常态的心态不要假设每一个元素一定存在。坑3find_all 返回列表你直接 .textlinkssoup.find_all(a)print(links.text)# ❌ 错的列表没有 .text 属性正确做法遍历列表。linkssoup.find_all(a)forlinkinlinks:print(link.text,link.get(href))find_all拿到的是一筐苹果你得一个个拿出来才能削皮。今天学了什么最后帮你梳理一下今天的核心方法方法作用返回值soup.find(标签)找第一个匹配的元素单个元素 或 Nonesoup.find_all(标签)找所有匹配的元素列表element.text提取元素文本字符串element.get(属性名)提取属性值字符串 或 Nonesoup.select(选择器)用CSS选择器找元素列表soup.select_one(选择器)用CSS选择器找第一个单个元素 或 None记住这 6 个方法80% 的网页提取场景你都能搞定。下一篇我们讲表格数据专项抓取——网页上的表格怎么一键提取懒人必备。本文仅讲解核心思路与关键代码片段适合零基础学习原理。完整可运行工程源码、配套测试数据、详细逐行注释、常见报错排错文档已打包成资源。【资源说明】所有资源仅限个人学习使用禁止商用、二次倒卖、公开分发包含完整源码 测试数据 使用文档不含一对一远程调试、环境配置答疑服务适合直接复用、写作业、练项目、做个人作品集【合规声明】本项目仅用于公开静态网页、公开学习数据采集练习禁止用于商业爬取、高频爬取、隐私数据爬取使用者自行承担使用责任。©️ 梅雅达编程笔记原创 · 首发 CSDN · 转载请注明出处