爬虫模块——数据解析之bs4模块
模块bs4(beautifulSoup)
基本概念
BeautifulSoup是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.BeautifulSoup会帮你节省数小时甚至数天的工作时间。
源码
官方英文文档:https://www.crummy.com/software/BeautifulSoup/bs4/doc/
中文文档:https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/
bs4-官方文档
基本使用
1.下载模块bs4,不受版本的限制 ,下载lxml插件
pip3.8 install bs4
pip3.8 install lxml
2.直接导入
from bs4 import BeautifulSoup
text="""
<a href="https:www.baidu.com"> </a>
<p>1234567</p>
<a>222</a>
<a>333</a>
<a>444</a>
"""
soup = BeautifulSoup(text,'lxml') # 第二个参数是解析器,不同的解析器功能不同,最好使用lxml ,需要提前下载
# soup = BeautifulSoup(text,'html')
print(soup.find('a')) # 拿到a标签
print(soup.find('a').text) # 拿到a标签里面的文本
print(soup.find('a').get('href')) # 拿到a标签里面的网址
print(soup.find_all()) # 拿到所有的标签
tag=soup.find_all()
tag.decompose() # 删除标签
对象的种类
Beautiful Soup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种: Tag , NavigableString , BeautifulSoup , Comment
- tag两个重要的属性
name和attributes
另外还有一个属性:多值属性:是 class,一个tag可以有多个CSS的class,在Beautiful Soup中多值属性的返回类型是list,
css_soup = BeautifulSoup('<p class="body strikeout"></p>')
css_soup.p['class']
# ["body", "strikeout"]
- 可以遍历的字符串
字符串常被包含在tag内.Beautiful Soup用 NavigableString 类来包装tag中的字符串 - BeautifulSoup
BeautifulSoup 对象表示的是一个文档的全部内容.大部分时候,可以把它当作 Tag 对象,它支持 遍历文档树 和 搜索文档树 中描述的大部分的方法.
因为 BeautifulSoup 对象并不是真正的HTML或XML的tag,所以它没有name和attribute属性.但有时查看它的 .name 属性是很方便的,所以 BeautifulSoup 对象包含了一个值为 “[document]” 的特殊属性 .name
4. Comment
遍历文档树
搜索文档树
过滤器
字符串
最简单的过滤器是字符串
soup.find_all('b')
正则表达式
如果传入正则表达式作为参数,Beautiful Soup会通过正则表达式的 search() 来匹配内容.下面例子中找出所有以b开头的标签,这表示和标签都应该被找到:
import re
for tag in soup.find_all(re.compile("^b")):
print(tag.name)
列表
如果传入列表参数,Beautiful Soup会将与列表中任一元素匹配的内容返回.下面代码找到文档中所有<a>
标签和<b>
标签
soup.find_all(["a", "b"])
TRUE
True
可以匹配任何值,下面代码查找到所有的tag,但是不会返回字符串节点
for tag in soup.find_all(True):
print(tag.name)
方法
如果没有合适过滤器,那么还可以定义一个方法,方法只接受一个元素参数 [4] ,如果这个方法返回 True,表示当前元素匹配并且被找到,如果不是则反回 False
下面方法校验了当前元素,如果包含 class 属性却不包含 id 属性,那么将返回 True
def has_class_but_no_id(tag):
return tag.has_attr('class') and not tag.has_attr('id')
find_all()
find_all( name , attrs , recursive , string , **kwargs )
find_all()
方法搜索当前tag的所有tag子节点,并判断是否符合过滤器的条件
find_all("p", "title") 返回的是CSS Class为”title”的
标签
find()
find( name , attrs , recursive , string , **kwargs )
find()与find_all()的区别
唯一的区别是:
find_all() 方法的返回结果是值包含一个元素的列表,而 find() 方法直接返回结果.
find_all() 方法没有找到目标是返回空列表, find() 方法找不到目标时,返回 None .
CSS筛选器
Beautiful Soup支持大部分的CSS选择器 http://www.w3.org/TR/CSS2/selector.html [6] , 在 Tag 或 BeautifulSoup 对象的 **.select() **方法中传入字符串参数, 即可使用CSS选择器的语法找到tag
1. 查找a标签
soup.select("body a")
# [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
2.通过CSS的类名查找
soup.select(".sister")
# [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
# <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
3.通过是否存在某个属性来查找
soup.select('a[href]')
# [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
# <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
标签对象方法汇总
属性、方法 | 含义 | 结果演示 |
---|---|---|
.name | 标签类型 | a标签对象.name --> a |
.attrs | 标签属性字典 | |
.text | 标签内部文本 | 嵌套的标签也会剔除<标签>的内容,只保留文本 |
.string | 内部文本的修改入口 | tag.string = 'new'与text只读相对应 |
.decomposed() | 将标签从soup的节点树中删除 | [tag.decomposed() for tag in soup.find_all('script')] |
上述就是针对标签的改查删功能,处理结果对它所属的beautifulsoup对象也同样生效。
更多的操作了解可以进官网文档进行查阅
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY