文章目录
一.基本介绍
目前流行使用的是beautifulSoup4(BeautifulSoup4简称bs4)开发bs4是一个HTML/XML的解析器,其主要功能是解析和提取HTML/XML数据。它不仅支持CSS选择器,而且支持python标准库中的HTML解析器,以及lxml的XML解析器
1.节点对象分类
bs4库将复杂的HTML文档转换成树结构(HTML DOM),这个结构中每个节点都是一个python对象,分类如下:
对象 | 说明 |
---|---|
bs4.element.Tag类 | 表示HTML中的标签,是最基本的信息组织单元,它有两个非常重要的属性,分别是表示标签名字的name属性和表示标签属性的attrs属性 |
bs4.element.NavigableString类 | 表示HTML中标签的文本(非属性字段) |
bs4.BeautifulSoup类 | 表示HTML DOM中的全部内容,支持遍历文档树和搜索文档树的大部分方法 |
bs4.element.Comment类 | 表示标签内字符串的注释部分,是一种特殊的NavigableString对象 |
2.使用bs4的流程
(1)创建一个BeautifulSoup对象
(2)通过BeautifulSoup的操作方法进行解读搜索
根据DOM树进行各种节点的搜索,例如,find_all()方法可以搜索出所有满足要求的节点
find方法只会搜索出第一个满足要求的节点,只要获得了一个节点,就可以访问节点名称,属性和文本
(3)利用DOM树结构标签的特性,进行更为详细的节点信息提取
二.构建BeautifulSoup类
1.BeautifulSoup类构造方法解析
def __init__(
self,
markup="", 表示要解析的文档字符串或文档对象
features=None, 表示解析器的名称
builder=None, 表示指定的解析器
parse_only=None,
from_encoding=None, 表示指定的编码格式
exclude_encodings=None, 表示排除的编码格式
**kwargs
)
2.创建BeautifulSoup对象
注意:如果没有指定解析器,那么BeautifulSoup对象会根据当前系统安装的库自动选择解析器 解析器选择顺序为:lxml html5lib python标准库
from bs4 import BeautifulSoup
# str表示被解析HTML文档的字符串,lxml表示使用lxml解析器
soup = BeautifulSoup(str,lxml)
3.prettify()方法
使用prettify()方法输出刚创建的BeautifulSoup对象soup
print(soup.prettify())
4.常用的两个方法
可以这些方法获取文本和标签属性
(1)find() 用于查找符合条件的第一个标签的节点
(2)find_all() 用于查找所有符合条件的标签节点,并返回一个列表
5.find_all()方法解析
find_all()方法参数解析:
def find_all(self,
name=None, 查找所有名字为name的标签,但是字符串会被自动忽略
1.传入字符串,BeautifulSoup对象会查找与字符串完全匹配的内容
2.传入正则表达式,BeautifulSoup对象会通过re模块match()进行匹配
3.传入列表,BeautifulSoup对象会将与列表中任一元素匹配的内容返回
attrs={}, 如果某个指定名字的参数不是搜索方法中内置的参数名,那么在进行搜索时,会把
该参数当作指定名称的标签中的属性来搜索
1.soup.find_all(id="link") 会搜索每个标签的id属性
2.如果要搜索的标签名称为class,由于class属于python中的关键字,所有class后面要加一个下划线
3.如果参数中包含特殊符号,可以将参数写成字典类型 soup.find_all(attrs={"data-foo":"value"})
recursive=True, 在调用find_all()方法时,BeautifulSoup对象会检索当前节点的所有子节点。这时,
如果只想搜索当前节点的直接子节点,就可以使用recursive = False
text=None, 传入text参数,可以搜索文档中的字符串内容。与name参数可选值一样,text参数可以接受字符串
正则表达式,列表等
limit=None, 可以使用limit参数来限制返回结果的数量,其效果和SQL中的效果类似
**kwargs)
6.快速体验BeautifulSoup小案例
案例说明:爬取古诗文大全7个头标题和对应的href
知识点: 1.获取标签中的文本 。2.获取标签中的属性
这些就是我们爬取的目标
import requests
from bs4 import BeautifulSoup
url = "https://so.gushiwen.org/shiwen/"
response = requests.get(url)
soup = BeautifulSoup(response.text,"lxml")
# 传入标签名和classs属性,返回一个可遍历集合
son1 = soup.find_all("div",class_="son1")
for item in son1:
# 查找每个item中a标签
a = item.find_all('a')
for i in a: # 这里 a 是一个结果集 可以遍历
# print(type(i)) #<class 'bs4.element.Tag'>
# get_text() 方法可以获取标签内的所有文本内容
title = i.get_text()
# 获取href属性值,因为 i 是一个bs4.element.Tag对象,前面已经介绍,所以可以直接获取属性
href = i['href']
# 打印输出
print(title+" ==href==> "+href)
输出结果
三.CSS选择器
CSS(Cascading Style Sheets)层叠样式表,是一种用来表现HTML或XML等文件样式的计算机语言,它不仅可以静态的修饰网页,而且可以配合各种脚本语言动态地对网页各元素进行格式化
1.通过标签名查找
在编写CSS时,标签的名称不用加任何修饰。调用select()方法时,可以传入包含某个标签的字符串 实例:
soup.select("title")
2.通过类名查找
在编写CSS时,需要在类名的前面加上"." 例如查找类名sister的类名,即class=“sister”
soup.select(".sister")
3.通过ID名查找
在编写CSS时,需要在id名称前面加上 # 例如查找id名为link1的标签 即id=“link1”
soup.select("#link1")
4.通过组合的形式查找
组合查找与编写class文件时,标签名,类名,id名的组合原理一样,二者之间需要用空格分开。例如:在标签 p 中,查找id值等于link1的内容
soup.select("p #link1")
可以使用 > 将标签与子标签分隔,从而找到某个标签下的直接子标签
soup.select("head > title")
5.通过属性进行查找
可以通过属性元素进行查找,属性需要用中括号括起来。但是属性和标签属于同一节点,它们中间不能加空格,否则无法匹配到
soup.select("a[@href="/python/python-func-staticmethod.html"]")
6.CSS选择器小案例
案例说明:爬取所有小标签的标题和href
知识点: 1.使用CSS搜索指定标签 。2.获取标签中的文本 。3.获取标签中的属性
这是我们要爬取的内容
案例试验
import requests
from bs4 import BeautifulSoup
url = "https://so.gushiwen.org/shiwen/"
response = requests.get(url)
soup = BeautifulSoup(response.text,"lxml")
# 使用css选择器 a_list是list类型
# 搜索class="sright"的标签的子标签a
a_list = soup.select(".sright > a")
for a in a_list:
# 跟上面的小案例大同小异
title = a.get_text()
href = a['href']
print(title+" ==href==> "+href)
输出结果
四.总结
1.从上面的案例可以看出,beautifulSoup4的API非常人性化,用起来非常简单
2.beautifulSoup4是载入整个文档,并转换成整个树结构。因此,beautifulSoup4需要花费更多的时间和内存,性能比较低。