手动获取源代码
我们也可以用requests方法来获取网页的html信息
我们输入import requests ,然后用get函数来获得这个链接所对应的内容
显示一下这个文本,这时候显示的就是这个页面的html内容
我们可以定义一个变量demo来简化一下,令 demo = r.text
下面对beautifulsoup库进行一个小测,输入 from bs4 import BeautifulSoup
尽管我们安装这个库的时候安装的是beautifulsoup4 ,但是我们使用的时候用的是它的简写bs4
所以我们 from bs4这个库,然后导入了一个类叫做 BeautifulSoup (注意B和S都要大写)
下面就是把这个demo页面变成这个BeautifulSoup能够理解的汤
我们有个变量叫 soup = BeautifulSoup(demo , “html.parser”)
我们除了给出demo,还要给出一个解释demo的解释器,这里面我们解释器选择的是html.parser
也就是说我们对demo进行html的解析
下面我们用print来检查我们的解析是否正确,也就是检查我们的库安装是否正确
print(soup.prettify())
这个相关内容输出了说明我们beautifulsoup库成功的解析了相关页面
简单来说,使用beautifulsoup库只需要两个代码
第一行这里面的 BeautifulSoup 是一个类,B 和 S 要大写
然后我们要做一锅汤,可以定义一个变量soup(也可以是其他变量名)
BeautifulSoup这个类型有两个参数
第一个参数是我们需要BeautifulSoup解析的一个html格式的信息,我们可以用'<p>data</p>来做个代替,同时我们也能用任何的变量如demo
同时我们也给出了解析这锅汤所使用的解析器,这里使用的html.parser
只用两个代码我们就能够看到的html和sml信息
Beautifulsoup库的基本元素
打开任何html文件的源代码可以看到它是由一系列尖括号构成的标签组织起来的
这里面每一个尖括号形成了一个标签,而标签之间每一对标签形成了一个上下游关系,形成了一个标签树
只要提交的文件是标签类型,那么Beautifulsoup库都能对它做很好的解析
接下来我们看一下每一个标签的具体格式
这里面我们以p标签为例
p标签是以一对尖括号形成的标签类型,它的名字是p
这三着是等价的
我们也可以通过打开文件的方式为BeautifulSoup类提供html或sml的文档内容
下面介绍获得tag标签的主要方法
下面介绍获得标签名字的方法
我们可以通过对任何一个标签使用.name的方式获得它的名字,这个名字显示出来是字符串类型
标签属性是在标签中表明标签相关特点的相关区域,它以字典形式来组织
假设这个时候汤已经做好了,我们选择a标签来做测试
我们用 .attrs 来获得标签属性,可以看到打印出了一个字典,字典中给出了这个标签属性中它的标签名字,属性名字和属性的值之间的对应关系
比如说,这里面我们要获取class属性的值,我们可以这样来实现
tag.attrs['class']
我们看到class属性的值是一个列表列表类型中的第一个元素是‘py1’
我们也可以获得a标签的链接属性 tag.attrs['href'],这个时候a标签打印出了一个链接
接下来我们看一下标签属性的类型,我们看到标签属性是个字典类型
标签是个标签类型
在bs4库中为标签定义了一种bs4
库认可的类型
tag的标签可以有0个或多个属性,如果没有属性存在的时候,我们使用attrs获得的字典是一个空字典,但是无论有无属性,我们总能获得一个字典
下面看tag标签的string元素,这个元素是一个字符串类型,它表示的是尖括号标签之间的那部分字符串
假设我们有一锅汤叫soup
soup.a 这是标签的信息,
a标签的string我们用soup.a.string来实现,我们可以看到这个tag标签中表达的信息是‘basic python’
通过p标签的字符串信息
再看一下NavigableString也是一个bs4库定义的类型
还有一个注意点,针对<p>标签的实例,我们可以看到<p>标签中实际还包含了一个<b>标签,但是当我们输出soup.p.string的时候,我们打印的string并不包含<b>标签,这说明NavigableString是可以跨越多个标签层次的
下面我们看一下tag的另一种类型叫comment类型,comment是注释的意思,表示的是如果是html页面中出现有注释的部分该怎么处理
我们重做一锅汤,我们看到在 <b> 标签中有一个注释
在html的表达中,我们用 <! 来表示一个注释的开始,那么 <p> 标签中呢给出的信息就不是一个注释
接下来看一下b标签的string,b标签打印出了注释内容
我们看下它的类型,他是一个bs4.element.comment类型
我们再来看一下p标签的类型, 我们发现p标签是一个字符串,同时它的类型是 NavigableString 类型
我们对p标签和b标签分别使用 .string 的时候,我们都能产生一段文本,但是当这个文本是注释形式的时候,它并没有标明它是注释,也就是说它的 <! 被去掉了,所以在有的时候分析文档的时候,我们需要对其中的注释部分做相关的判断,而判断的依据就是它的类型,这种情况在我们分析文本中并不常用,所以稍做了解就行
具体使用方法:
我们可以用 .tag 方式获得标签信息,比如说我们soup.a获得a标签 soup.p获得p标签
.name的方式获得标签的名字,比如说p.name
.attrs获得标签的属性
这里面,无论是否一个标签存在属性,它都会返回一个字典类型
对于标签之间的字符串,我们可以用 .string 的方式获取
获取过程中,如果其中存在注释,那么它会返回一种特殊的注释类型
如果我们不希望提取注释信息,需要对这种类型做相关的判断