【python&爬虫】快速入门BeautifulSoup解析器

一.基本介绍

目前流行使用的是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需要花费更多的时间和内存,性能比较低。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章