您的位置:首页 > 其它

beautifulsoup4库

2020-08-28 19:44 183 查看

BeautifulSoup库

beautifulsoup4库是一个解析和处理HTML和XML的第三方库。
使用requests库获取网页的内容后,需要进一步解析HTML页面格式,因为一个网页不只有内容,还有其他很多的语法用于构成页面的元素比如标题、页眉页脚、水印、页面颜色等等。
因此我们需要一个用于处理HTML的库来解析出我们需要的内容。另外,由于名字太长,beautifulsoup4库又被称作bs4库。
beautifulsoup4库中最主要的是BeautifulSoup类
这里beautifulsoup4库采用面向对象的思想实现,把每一个页面当作一个对象。
我们可以采用from import的方法从bs4库中引入BeautifulSoup类,引入Beautifulsoup类后,使用BeautifulSoup()创建一个BeautifulSoup对象

from bs4 import BeautifulSoup

如上代码引入BeautifulSoup类后就可以开始创建BeautifulSoup对象了。
创建出的BeautifulSoup对象是一个树形结构,包含HTML页面中的每一个Tag(标签)元素,如head,body等。简单地说就是HTML中的主要结构都变成了BeautifulSoup对象的一个属性。
下面我们简单的介绍几个常用的属性:
①head:
HTML页面的head内容
②title:
HTML页面标题,在head中,由title标记
③body:
HTML页面中的body内容
④p:
HTML页面中第一个p内容
⑤strings:
HTML页面所有呈现在web上的字符串,就是标签的内容
⑥stripped_strings:
HTML页面所有呈现在Web上的非空格字符串。

这里虽然只讲解了BeautifulSoup只需传进去一个Response对象,但是我传进去之后就发生了异常:

import requests
from bs4 import BeautifulSoupr = requests.get("http://www.baidu.com")
r.raise_for_status()
r.encoding='UTF-8'
soup=BeautifulSoup(r.text)
print(soup.title)
print(soup.body)
print(soup.head)

这是结果:

GuessedAtParserWarning: No parser was explicitly specified, so I’m using the best available HTML parser for this system (“html.parser”). This usually isn’t a problem, but if you run this code on another system, or in a different virtual environment, it may use a different parser and behave differently.
The code that caused this warning is on line 6 of the file D:/python_work/build/Demo.py. To get rid of this warning, pass the additional argument ‘features=“html.parser”’ to the BeautifulSoup constructor.
soup=BeautifulSoup(r.text)

这一大串我看的也是一脸懵,命名requests.get就已经获取了一个Response对象了啊,为什么还有这样一大串东西呢?
定睛一看看到了
pass the additional argument ‘features=“html.parser”’ to the BeautifulSoup constructor.这句话,大致意思是向BeautifulSoup构造函数中添加参数features=“html.parser。
大致意思就是我们没有指明解析器,所以这里通过前面传递的参数给你提示说要指定一个解析器,按照它的要求添加上‘features=“html.parser”这样的参数就可以了。
这是改过以后的代码

import requests
from bs4 import BeautifulSoupr = requests.get("http://www.baidu.com")
r.encoding='utf-8'
soup=BeautifulSoup(r.text,features="html.parser")
head=soup.head
title=soup.title
body=soup.body
strings=soup.strings
print("页面的head内容是:{}".format(head))
print("页面的title内容是:{}".format(title))
print("页面的body内容是:{}".format(body))
print("页面的strings内容是:{}".format(strings))

结果是:

可以看到页面的内容显示的是一堆代码,但是标题被我们提取出来了。
这说明一个网页的实际内容不止我们看起来这么简单,一个网页是由很多行代码堆起来的。
百度的搜索页面看起来很简单,但是代码有很多很多呢

那么我们代码中的head变量,title变量他们是什么类型呢?
测试一下发现他们是Tag类型

这说明:BeautifulSoup的属性与HTML的标签名称相同,每一个Tag标签在beautifulsoup4库中也是一个对象,叫做Tag对象。
每个标签对象都有类似的结构:
有类似的结构:
< a class=“mnav” href=“http://www.baidu.com”></ a>)尖括号<>中标签的名字是name,尖括号内其他项是attrs,尖括号之间的内容是string。因此可以通过Tag对象的name、attrs、string属性获取相应的内容:

标签对象的常用属性
①name
字符串,标签的名字
②attrs
字典,包含了原来页面Tag所有的属性
③contents
列表,这个Tag下所有子Tag的内容
④string
字符串,Tag所包含的文本,网页中真实的文字

import requests
from bs4 import BeautifulSoupr = requests.get("http://www.baidu.com")
r.encoding='utf-8'
soup=BeautifulSoup(r.text,features="html.parser")
head=soup.head
title=soup.title
body=soup.body
print("标签head的名称是是:{}".format(head.name))
print("标签head的属性字典是:{}".format(head.attrs))
print("标签head的列表内容是:{}".format(head.contents))
print("标签head的文本是:{}".format(head.string))

输出结果为:

由于HTML语法可以在标签中嵌套其他标签,所以string属性的返回值遵循如下原则
1.如果标签内部没有其他标签,string返回其内容
2.如果标签内部还嵌套一个标签,string返回最里面的标签内容
3.如果标签内部有超过一层的标签嵌套,返回None。

如果我们需要列出标签对应的所有内容或者需要找到非第一个标签时,需要用到BeautifulSoup的find和find_all方法。

find_all(name,attrs,recursive,string,limit)
根据参数找到对应的标签,返回一个列表类型。
name:按照标签名字检索,名字用字符串表示
attrs:按照标签属性值检索,需要列出属性名称和值,用JSON表示
recursive:设置查找层次,只查找当前标签下一层时有recursive=False
string:按照关键字检索string属性内容,采用string=开始
limit:返回结果个数,默认返回全部结果。

简单来说就是find_all方法可以根据标签名字、标签属性和内容检索并返回标签列表。通过片段字符串检索时需要使用正则表达式re函数库,直接采用import关键字就可以引入re库,采用re.compile(‘abc’)实现对片段字符串abc的检索。当需要检索标签的属性时可以采用JSON格式如:
‘src’:re.compile(‘abc’)

BeautifulSoup类还提供了一个find方法,与find_all相比,find方法只能返回找到的第一个结果,并且结果以字符串形式返回。

import requests
from bs4 import BeautifulSoupr = requests.get("http://www.baidu.com")
r.encoding='utf-8'
soup=BeautifulSoup(r.text,features="html.parser")
head=soup.head
title=soup.title
body=soup.body
find=soup.find_all('meta')
print("查找的结果有{}个,如下".format(len(find)))
for i in find:
print("内容是:{}".format(i))

我们的查找结果是:

初步的爬虫可以用我们的requests库和beautifulSoup4库做出来,我们将在下面进行展示,那么今天你学费了吗

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: