BeautifulSoup
1、BeautifuSoup 是什么
灵活又方便的网页解析库,处理高效,支持多种解析器,利用它不用编写正则表达式既可方便地实现网页信息的提取。
安装:
pip3 install beautifulsoup4
用法讲解
解析器 | 使用方法 | 优势 | 劣势 |
python标准库 | BeautifulSoup('带解析代码','html.parser') | python内置标准库 | 容错内里差 |
lxml HTML解析器 | BeautilfulSoup('带解析代码','lxml') | 速度快、文档容错能力强 | 需要安装C语言库 |
lxml XML解析库 | BeautifulSoup('带解析代码','xml') | 速度快、唯一支持xml的解析器 | 需要安装C语言库 |
html5lib | BeautifulSout('带解析代码','html5lib') | 最好的容错性、以浏览器的方式解析文档,生成html5格式的文档 | 速度快、不依赖外部扩展 |
来个栗子
from bs4 import BeautifulSoup html ="""<ul id="navList"> <li><a id="blog_nav_sitehome" class="menu" href="http://www.cnblogs.com/">博客园</a></li> <li><a id="MyLinks1_SpaceLink" class="menu" href="http://ing.cnblogs.com/">闪存</a></li> <li><a id="blog_nav_myhome" class="menu" href="http://www.cnblogs.com/youmingkuang/">首页</a></li> <li><a id="blog_nav_newpost" class="menu" rel="nofollow" href="https://i.cnblogs.com/EditPosts.aspx?opt=1">新随笔</a></li> <li><a id="blog_nav_contact" accesskey="9" class="menu" rel="nofollow" href="https://msg.cnblogs.com/send/%E5%B9%BD%E5%86%A5%E7%8B%82_%E4%B8%83">联系</a></li> <li><a id="blog_nav_admin" class="menu" rel="nofollow" href="https://i.cnblogs.com/">管理</a></li> <li><a id="blog_nav_rss" class="menu" href="http://www.cnblogs.com/youmingkuang/rss">订阅</a> <a id="blog_nav_rss_image" class="aHeaderXML" href="http://www.cnblogs.com/youmingkuang/rss"><img src="//www.cnblogs.com/images/xml.gif" alt="订阅" /></a></li> </ul> """ soup = BeautifulSoup(html,'lxml') print(soup.prettify()) """格式化代码""" print(soup.li.string)
2、标签选择器
1、选择元素
from bs4 import BeautifulSoup html ="""<ul id="navList"> <title>标题</title> <header>大脑袋</header> <li name="dromouse"><a id="blog_nav_sitehome" class="menu" href="http://www.cnblogs.com/">博客园</a></li> <li name="dromouse1"><a id="MyLinks1_SpaceLink" class="menu" href="http://ing.cnblogs.com/">闪存</a></li> <li><a id="blog_nav_myhome" class="menu" href="http://www.cnblogs.com/youmingkuang/">首页</a></li> <li><a id="blog_nav_newpost" class="menu" rel="nofollow" href="https://i.cnblogs.com/EditPosts.aspx?opt=1">新随笔</a></li> <li><a id="blog_nav_contact" accesskey="9" class="menu" rel="nofollow" href="https://msg.cnblogs.com/send/%E5%B9%BD%E5%86%A5%E7%8B%82_%E4%B8%83">联系</a></li> <li><a id="blog_nav_admin" class="menu" rel="nofollow" href="https://i.cnblogs.com/">管理</a></li> <li><a id="blog_nav_rss" class="menu" href="http://www.cnblogs.com/youmingkuang/rss">订阅</a> <a id="blog_nav_rss_image" class="aHeaderXML" href="http://www.cnblogs.com/youmingkuang/rss"><img src="//www.cnblogs.com/images/xml.gif" alt="订阅" /></a></li> </ul> """ soup = BeautifulSoup(html,'lxml') print(soup.title) print(soup.header) print(soup.li)
输出:
如果加了.string
print(soup.title.string) print(soup.header.string) print(soup.li.string)
输出就是具体的文字
标题
大脑袋
博客园
2、获取名称
soup = BeautifulSoup(html,'lxml') print(soup.title.name)
输出:
title
3、获取属性
soup = BeautifulSoup(html,'lxml')
print(soup.li.attrs['name']) //第一种方式
print(soup.li['name']) //第二种方式
输出:
dromouse
dromuser1
4、嵌套选择
soup = BeautifulSoup(html,'lxml')
print(soup.li.attrs['name'])
print(soup.ul.li.a.string)
输出:
博客园
5、子节点和子孙节点
soup = BeautifulSoup(html,'lxml')
print(soup.li.attrs['name'])
print(soup.ul.contents) //输出这个标签内部的全部标签及内容
输出:
['\n', <title>标题</title>, '\n', <header>大脑袋</header>, '....<a class="menu" href="http://www.cnblogs.com/youmingkuang/rss" id="blog_nav_rss">订阅</a>
第二获取子节点:迭代器
soup = BeautifulSoup(html,'lxml')
print(soup.ul.children)
for i,child in enumerate(soup.ul.children):
print(i,child)
输出:
第三 获取子节点: 子孙节点(迭代器)
soup = BeautifulSoup(html,'lxml')
print(soup.ul.descendants)
for i,child in enumerate(soup.ul.descendants):
print(i,child)
输出:
6、find_all
soup = BeautifulSoup(html,'lxml')
for ul in soup.find_all('ul'):
print(ul.find_all('li'))
查找出所有ul下面的li标签及其子标签

7、attrs
soup = BeautifulSoup(html,'lxml')
print(soup.find_all(attrs={"id":"blog_nav_admin"}))
print(soup.find_all(attrs={"class":"aHeaderXML"}))
输出:
或者
print(soup.find_all(id="blog_nav_admin"))
print(soup.find_all(class_="aHeaderXML")) 更加简单
8、find 是返回单个结果。
9、find_parents() 和 find_parent()
三、CSS 选择器
soup = BeautifulSoup(html,'lxml')
print(soup.select('.panal .panel-heading'))
print(soup.select('ul li'))
print(soup.select('#list-2 .element'))
print(soup.select('ul')[0])
获取属性
soup = BeautifulSoup(html,'lxml')
for ul in soup.select('ul'):
print(ul['id'])
print(ul.attrs['id'])
获取内容
soup = BeautifulSoup(html,'lxml')
for ul in soup.select('li'):
print(ul.get_text())
输出:
博客园
闪存
首页
新随笔
联系
管理
订阅
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了