今天继续给大家介绍Python 爬虫相关知识,本文主要内容是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
bs4支持从文档中读取数据,或者是直接使用requests爬虫模块从网络上获取数据。
从文档中数据读取代码如下所示:
fp=open('fileName','r')
soup=BeautifulSoup(fp)
而从网络中数据读取代码如下所示:
page_text=requests.get(url),text
soup=BeautifulSoup(page_text)
接下来,我们就介绍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库使用的示例,代码如下所示:(输出在注释中)
from bs4 import BeautifulSoup
fp=open('./test.html','r',encoding='utf-8')
soup=BeautifulSoup(fp,'lxml')
print(soup.img)
#
print(soup.find("img"))
#
print(soup.find("span",class_="dec"))
#专栏收录该内容
print(soup.find_all("span"))
#[
#
#渗透测试
#专栏收录该内容
#
#,
#渗透测试
#专栏收录该内容
#, 渗透测试, 专栏收录该内容, 126 篇文章, 20 订阅]
print(soup.select('.item-m'))
#[
#126 篇文章
#20 订阅
#]
print(soup.select('.column-group > div > div > a > img'))
#[]
print(soup.select('.column-group img'))
#[]
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