当前位置: 首页 > 工具软件 > Python bsddb3 > 使用案例 >

Python bs4解析库使用详解

雷国兴
2023-12-01

今天继续给大家介绍Python 爬虫相关知识,本文主要内容是Python bs4解析库使用详解。

一、Python bs4库简介与安装

bs4是Python的一个第三方库,主要用于从HTML或者是XML文档中快速提取数据。bs4是BeautifulSoup库的简称,最后的4是版本号。要想使用bs4进行数据解析,就必须先安装bs4,安装命令为:

pip install bs4

安装完毕后,在Python程序中导入时,可添加代码:

from bs4 import BeautifulSoup

接下来我们就可以使用bs4来进行HTML文档数据解析啦。
此外,在使用bs4库时,我们还需要指定文档解析器,我们可以选择Python自带的html.parser,但是该解析器执行速度较慢。我们还可以选择lxml和html5lib,这两个解析器执行速度比较快,但是需要安装Python的第三方库。
在本文中,我们选择lxml作为BeautifulSoup的解析器,安装需要执行命令:

pip install lxml

二、Python bs4库获取数据

bs4支持从文档中读取数据,或者是直接使用requests爬虫模块从网络上获取数据。
从文档中数据读取代码如下所示:

fp=open('fileName','r')
soup=BeautifulSoup(fp)

而从网络中数据读取代码如下所示:

page_text=requests.get(url),text
soup=BeautifulSoup(page_text)

三、Python bs4库使用

接下来,我们就介绍Python bs4库的使用。

(一)基本标签查找

在引入(读取)数据后,执行命令:

soup.tanName

可以获取第一个tagName标签,例如,执行命令:

soup.a

就可以获取第一个a标签。
我们还可以使用命令:

soup.find('a')

达到与soup.a同样的效果。但是soup.find()函数还支持属性定位,及查找指定属性的标签,例如:

soup.find(a,class_="asd")

就可以查找第一个属性为asd的a标签。注意这里的“class_”,在最后的时候,还存在一个下划线,但是如果是其他的属性,就不需要下划线。
以上是找到第一个符合条件的标签,如果我们想查找所有符合条件的标签,就需要使用soup.find_all()函数。
除了以上函数外,bs4库还支持soup.select()函数,该函数可以查找指定class属性的标签,该函数使用如下所示:

soup.select('.item')

该函数在使用时输入是一个字符串,并且字符串第一个字符是一个点号,之后跟着要查找的类名,上述代码就可以查找所有类是item的标签,该函数返回结果是一个列表。

(二)递进关系标签查找

soup.select()函数还支持递进关系的查找。在HTML代码中,标签与标签之间总是有嵌套的关系,我们经常需要根据这种嵌套关系查找指定的标签。soup.select()方法查找指定内容示例如下:

soup.select('.item > ul > li >a')

在上述函数中,输入字符串以“>”符号标识递进关系,因此上述代码就标识先查找item类的标签,然后查找该标签下的ul标签下的li标签下的a标签。
该函数返回结果同样是一个列表。

(三)获取标签间的文本数据

在获取到指定标签号,有时我们还需要获取标签中的文本数据。获取标签中的文本数据有以下三种方法:

soup.a.text
soup.a.string
soup.a.get_text()

上述三种方法,都可以获取soup.a查找出来的a标签中的文本内容,但是soup.a.text和soup.a.get_text()函数获取的内容包括该标签下所有子标签之间的文本内容;而soup.string则获取的是该标签下的文本内容,不包括该标签下子标签中间的文本内容。

(四)获取标签中的属性值

有时,我们还需要获取标签中的属性值。获得属性值可以使用中括号,然后把属性名称字符串放入到中括号里面,例如:

soup.a['href']
soup.select('.item')[0]['src']

上面两个代码分别可以获取指定标签中的指定属性值,其中第二行代码之所以还有一个[0]是因为soup.select()函数返回结果是一个列表,因此我们需要首先将列表中的标签取出后然后再取出该标签的指定属性值。

四、Python bs4库使用示例

最后,我们再举几个Python bs4库使用的示例,代码如下所示:(输出在注释中)

from bs4 import BeautifulSoup

fp=open('./test.html','r',encoding='utf-8')
soup=BeautifulSoup(fp,'lxml')
print(soup.img)
#<img alt="" class="item-target" src="https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64"/>
print(soup.find("img"))
#<img alt="" class="item-target" src="https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64"/>
print(soup.find("span",class_="dec"))
#<span class="dec">专栏收录该内容</span>
print(soup.find_all("span"))
#[<span class="title item-target">
#<span>
#<span class="tit">渗透测试</span>
#<span class="dec">专栏收录该内容</span>
#</span>
#</span>, <span>
#<span class="tit">渗透测试</span>
#<span class="dec">专栏收录该内容</span>
#</span>, <span class="tit">渗透测试</span>, <span class="dec">专栏收录该内容</span>, <span>126 篇文章</span>, <span>20 订阅</span>]
print(soup.select('.item-m'))
#[<div class="item-m">
#<span>126 篇文章</span>
#<span>20 订阅</span>
#</div>]
print(soup.select('.column-group > div > div > a > img'))
#[<img alt="" class="item-target" src="https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64"/>]
print(soup.select('.column-group img'))
#[<img alt="" class="item-target" src="https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64"/>]
print(soup.select('.tit')[0].string)
#渗透测试
print(soup.select('.column-group')[0].text)
#渗透测试
#专栏收录该内容
#126 篇文章
#20 订阅
#注:本输出之间有很多空行
print(soup.div['id'])
#blogColumnPayAdvert

test.html文件中内容如下所示:

<div id="blogColumnPayAdvert">
            <div class="column-group">
                <div class="column-group-item column-group0 column-group-item-one">
                    <div class="item-l">
                        <a class="item-target" href="https://blog.csdn.net/weixin_40228200/category_10842525.html" target="_blank" title="渗透测试"
                        data-report-view='{"spm":"1001.2101.3001.6332"}'
                        data-report-click='{"spm":"1001.2101.3001.6332"}'>
                            <img class="item-target" src="https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64" alt="">
                            <span class="title item-target">
                                <span>
                                <span class="tit">渗透测试</span>
                                    <span class="dec">专栏收录该内容</span>
                                </span>
                            </span>
                        </a>
                    </div>
                    <div class="item-m">
                        <span>126 篇文章</span>
                        <span>20 订阅</span>
                    </div>
                </div>
            </div>
        </div>

原创不易,转载请说明出处:https://blog.csdn.net/weixin_40228200

 类似资料: