21天学习挑战赛——Python爬虫解析器BeautifulSoup4

目录

1. BeautifulSoup4概述

1.1 BeautifulSoup4介绍

1.2 导入BeautifulSoup

​1.3 解析库

2. 应用举例

2.1 基础操作

2.2 对象种类 

2.2.1 Tag

2.2.2 NavigableString

2.2.3 BeautifuSoup

2.2.4 Comment

2.3 搜索文档树

2.4 css选择器


A person can succeed at almost anything for which they have unlimited enthusiasm.

     只要有无限的热情,一个人几乎可以在任何事情上取得成功。                                   🌈

活动地址:CSDN21天学习挑战赛

1. BeautifulSoup4概述

1.1 BeautifulSoup4介绍

        BeautifulSoup是一个可以从HTML或XML文件中提取数据的Python库,它能够通过自己喜欢的转换器实现惯用的文档导航、查找、修改文档的方式。Beautiful可以节省数小时甚至数天的工作时间。BeautifulSoup4是Python第三方库,需要进行下载。Pycharm下载方式:地址

BeautifulSoup4将网页转换为一棵DOM树,如下图所示:

1.2 导入BeautifulSoup

from bs4 import BeautifulSoup

​1.3 解析库

        BeautifulSoup在解析式实际上依赖解析器,它除了支持Python标准宽中的HTML解析器外,还支持一些第三方解析器(比如lxml)。

解析器使用方法优势劣势
Python标准库BeautifulSoup(html, 'html.parser')Python的内置标准、执行速度适中、文档容错能力强Python2.7.3及Python3.2.2之前的版本文档容错能力差
lxml HTML解析库BeautifulSoup(html, 'lxml')速度快、文档容错能力强需要安装C语言库
lxml XML解析库BeautifulSoup(html, 'xml')速度快、唯一支持XML的解析器需要安装C语言库
html5lib解析库BeautifulSoup(html, 'html5lib')最好的容错性、以浏览器的方式解析文档,生成HTMLS格式的文档速度慢、不依赖外部扩展

        其中,最常用的解析器是lxml HTML解析器,其次是html5lib

2. 应用举例

2.1 基础操作

方法说明
soup = BeautifulSoup(html, 'lxml')创建对象
soup = BeautifulSoup(open('test.html'),'lxml')读取HTML文件
soup.prettify()获取HTML的缩进格式
soup.title获取title标签的所有内容
soup.title.name获取title标签的名称
soup.title.string获取title的文本内容
soup.head获取head标签的所有内容
soup.div获取第一个div标签中的所有内容
soup.div['id']获取第一个div标签的id的值
soup.a获取第一个a标签中的所有内容
soup.find_all('a')获取所有的a标签中的所有内容
soup.find(id='u1')获取id=u1的内容
for item in soup.find_all('a'):
    print(item.get('href'))
获取所有的a标签,并遍历打印a变迁中的href值
for item in soup.find_all('a'):
    print(item.get_text())
获取所有的a标签,并遍历打印a标签的文本值

2.2 对象种类 

        BeautifulSoup将复杂的HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4中:Tag、NavigableString、BeautifulSoup、Comment。

2.2.1 Tag

        Tag通俗点讲就是HTML中的一个个标签。Tag有很多方法和属性,在遍历文档树和搜索文档树中有详细解释。Tag最重要的属性是:nameattributes注意:如果改变了Tag的name属性,将影响所有通过当前BeautifulSoup对象生成的HTML文档。Tag的属性可以被添加、删除和修改。

用法举例:

from bs4 import BeautifulSoup

soup = BeautifulSoup('<b class="boldest">Extremely bold</b>','lxml')
tag = soup.b
print(tag) #输出:<b class="boldest">Extremely bold</b>
print(type(tag)) #输出:<class 'bs4.element.Tag'>

#name属性
print(tag.name) #输出:b
tag.name = 'b1'
print(tag) #输出:<b1 class="boldest">Extremely bold</b1>

#Attributes属性
print(tag['class']) #选择class属性。输出:['boldest']
print(tag.attrs) #之间用“点”取属性,例如.attrs,选择attrs属性。输出:{'class': ['boldest']}

#添加id属性
tag['id']=1
#修改class属性
tag['class'] = 'tl1'
#删除class属性
del tag['class']

2.2.2 NavigableString

        NavigableString用.string获取标签内部的文字。

​​​​​​​用法举例:

from bs4 import BeautifulSoup

soup = BeautifulSoup('<b class="boldest">Extremely bold</b>','lxml')
print(soup.b.string) #输出:Extremely bold
print(type(soup.b.string)) #输出:<class 'bs4.element.NavigableString'>

2.2.3 BeautifuSoup

        BeautifulSoup表示的是一个文档的内容,可以获取它的类型、名称以及属性。

​​​​​​​用法举例:

from bs4 import BeautifulSoup

soup = BeautifulSoup('<b class="boldest">Extremely bold</b>','lxml')
print(type(soup.name)) #输出:<class 'str'>
print(soup.name) #输出:[document]
print(soup.attrs) #输出:{}   文档本身的属性为空

2.2.4 Comment

        Comment是一个特殊类型的NavigableString对象,其输出的内容不包括注释符号。

​​​​​​​用法举例:

from bs4 import BeautifulSoup

soup = BeautifulSoup('<b class="boldest">Extremely bold</b>','lxml')
print(soup.b) #输出:<b class="boldest">Extremely bold</b>
print(soup.b.string) #输出:Extremely bold
print(type(soup.b.string)) #输出:<class 'bs4.element.NavigableString'>

2.3 搜索文档树

函数语法:find_all(name, attrs, recursive, text, **kwargs)

参数说明:

name :name参数可以查找所有名字为name的tag,字符串对象会被自动忽略掉。可以匹配字符串、正则表达式、列表

text :通过text参数可以搜搜文档中的字符串内容,与name参数的可选值一样,text参数接收字符串、正则表达式、列表;

用法举例:

1.name参数举例

soup.find_all('a') :查找与字符串完整匹配的内容,用于查找文档中所有的<a>标签

soup.find_all(re.compile('^b')) :传入正则表达式,BeautifulSoup会通过正则表达式的match()来匹配内容。返回所有表示<body>和<b>标签。

soup.find_all(['p','a']) :传入列表参数,BeautifulSoup会与列表中任一元素匹配的内容返回。返回所有的<p>和<a>标签。

2.text参数举例

soup.find_all(text='a') :匹配字符串

soup.find_all(text=re.compile('^b')) :匹配正则表达式

soup.find_all(text=['p', 'a']) :匹配列表

3.kwargs参数举例

soup.find_all(id='link2') 

2.4 css选择器

        在使用BeautifulSoup解析库时,经常会结合css选择器来提取数据。以下仅介绍css选择器选择标签。

获取方式举例说明
根据标签名查找比如写一个 li 就会选择所有的 li标签,一般不用,因为都是精确到标签再提取数据
根据类名class查找

.line,即一个点加line,这个表达式选的时class=‘line’的所有标签,‘.‘代表class

根据id查找#box,即一个井号加box,表示选取id=’box‘的所有标签,“#”代表id
根据属性的名字查找data[name='username']表达式查找name='username'标签,此处注意和Xpath的区别。
标签+类名或id的形式例如:ul#list-1。查找id为list-1的ul标签
查找直接子元素例如:#list-1>li。查找id='list-1'的标签下的直接子元素li
查找子孙标签例如:.panel_body li。.panel_body和li直接是一个空格,表示查找id='panel_body'标签下的子或孙标签li
取某个标签的属性例如:data['href']。选择data中的href属性的内容。
1)获取文本内容:string获得某个标签下的文本内容,强调一个标签,不含嵌套。返回一个字符串
2)获取文本内容:strings获得某个标签下的所有文本内容,可以嵌套。返回一个生成器,可用list(生成器)转换为列表
3)获取文本内容:stripped.strings跟第二种方法差不多,只不过它会去掉每个字符串头部和尾部的空格和换行符
4)获取文本内容:get.text()获取所有字符串,含嵌套,不管会把所有字符串拼接为一个,然后返回。

​​​​​​​注意:获取文本内容的前3个是属性,不加括号;最后一个是函数,加括号。

用法举例:

from bs4 import BeautifulSoup

html = '''
<div class="panel">
    <div class="panel-heading">
        <h4>Hello</h4>
    </div>
    <div class="panel_body">
        <ul class="list" id="list-1" name="element">
            <li class="element">Foo</li>
            <li class="element">Bar</li>
            <li class="element">Jay</li>
        </ul>
        <ul class="list list-small" id="list-2">
            <li class="element">Foo</li>
                <a href="https://www.baidu.com">百度官网</a>
            <li class="element">Bar</li>
        </ul>
    </div>
</div> 
'''
#创建对象
soup = BeautifulSoup(html, 'lxml')
#1.根据标签名查找:查找li标签
print(soup.select("li"))
#2.根据类名class查找
print(soup.select(".panel_body"))
#3.根据id查找
print(soup.select('#list-1'))
#4.根据属性名查找
print(soup.select("ul[name='element']"))
#5.标签+类名或id的形式
print(soup.select('ul#list-1')) #查找id为list-1的ul标签
print(soup.select('ul.list')) #查找calss为list的ul标签
#6.查找字节子元素
print(soup.select('#list-1>li')) #查找id='list-1'的标签下的直接子标签li
#7.查找子孙标签
print(soup.select('.panel_body li' )) #.panel_body和li之间是一个空格,表示查找id='panel_body'的标签下的子或孙标签li
#8.取某个标签的属性
div = soup.select('.panel_body')[0] #先取到<div class='panel_body'>
print(div.select('a')[0]['href']) #再取下面的a标签下的href属性
#9.1 string:获取某个标签下的文本内容,强调一个标签,不含嵌套,返回一个字符串。
div = soup.select('.panel_body')[0] #先取到<div class='panel_body'>
print(div.select('a')[0].string) #再取下面的a标签的内容
#9.2 strings:获得某个标签下的所有文本内容,可以嵌套。返回一个生成器,可用list(生成器)转换为列表
print(div.strings)
print(list(div.strings))
#9.3 stripped.strings:跟9.2差不多,只不过会去掉每个子不传头部和尾部的空格和换行符
print(soup.stripped_strings)
print(list(soup.stripped_strings))
#9.4 get.text()获取所有字符串,含嵌套。不管会把所有字符串拼接为一个,然后返回
print(div.get_text())

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

花落指尖❀

您的认可是小浪宝宝最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值