beautiful soup 4.0(bs4)基本应用(1)

1、概述

人工智能行业的发展是以大数据为基础的,在人工智能行业当中,数据比模型本身要重要的多。从一定程度上来讲大量优质的数据可以弥补模型的缺点。而大数据所所涉及的范畴会非常的广泛,有很多在垂直行业深耕很多年的企业会积累很多的行业数据。但这种企业毕竟是少数,很多情况下我们需要自己开发爬虫从互联网上抓取数据,而爬虫程序一个非常重要的环节就是对互联网上的网页进行分析,由于网页上的资料和形式千差万别,能够从这些文档中获取自己的数据就变得尤为重要。

bs4是python库主要用于对标记语言进行分析。而在爬虫程序中使用最多的场景是分析网页文档,也就是html文档。本文重要讲解bs4的基本用法。

2、安装

可以使用下面命令在linux系统中安装beautiful soup库

pip install beautifulsoup4

同时beautiful soup4.0 在支持不同的解析器,如下表所示

解析器 使用方法 优势 劣势
Python标准库 BeautifulSoup(markup, "html.parser")
  • Python的内置标准库
  • 执行速度适中
  • 文档容错能力强
  • Python 2.7.3 or 3.2.2)前 的版本中文档容错能力差
lxml HTML 解析器 BeautifulSoup(markup, "lxml")
  • 速度快
  • 文档容错能力强
  • 需要安装C语言库
lxml XML 解析器

BeautifulSoup(markup, ["lxml-xml"])

BeautifulSoup(markup, "xml")

  • 速度快
  • 唯一支持XML的解析器
  • 需要安装C语言库
html5lib BeautifulSoup(markup, "html5lib")
  • 最好的容错性
  • 以浏览器的方式解析文档
  • 生成HTML5格式的文档
  • 速度慢
  • 不依赖外部扩展

一般情况下,我们可以通过bs4自带的标准库进行解析,如果需要可以自行安装其他的解析器,下面以html5lib为例说明安装具体命令。

pip install html5lib

3、基本应用

3.1 bs4 对象的种类

本文主要介绍bs4在解析html文档场景中的应用,对于html的基本结构这里不做赘述。在bs4解析html的应用中,文档会被解析成一个属性结构,这种解析方式与浏览器的dom树结构相似。在这个树中,每一个元素都以对象的形式存在,这些对象不论如何嵌套应用,都可以被归纳成4种。

  • Tag
  • NavigableString
  • BeautifulSoup
  • Comment

3.1.1 Tag

标签是html的主要组成,所有标记语言的节点都是以标签形式出现的。请参照如下代码:

from bs4 import BeautifulSoup
soup = BeautifulSoup('<b class="boldest">Extremely bold</b>')
tag = soup.b
type(tag)
# <class 'bs4.element.Tag'>

输出效果如下图所示

Tag有很多方法和属性,现在介绍一下tag中最重要的属性: name和attributes

1)name属性

可以通过下面代码来获取标签的属性

from bs4 import BeautifulSoup
soup = BeautifulSoup('<b class="boldest">Extremely bold</b>')
tag = soup.b
print(tag.name)
# b

通过可以通过该属性来修改标签,如果改变了tag的name,那将影响所有通过当前Beautiful Soup对象生成的HTML文档。请参考如下代码:

from bs4 import BeautifulSoup
soup = BeautifulSoup('<b class="boldest">Extremely bold</b>')
tag.name = 'a'
print(tag)

输出效果如下图所示:

2)  Attributes

一个tag可能有很多个属性. tag <b class="boldest"> 有一个 “class” 的属性,值为 “boldest” . tag的属性的操作方法与字典相同,请参考如下代码:

from bs4 import BeautifulSoup
soup = BeautifulSoup('<b class="boldest">Extremely bold</b>')
print(tag['class'])
# ['boldest']

也可以使用attrs可以以字典形式返回标签的所有属性,请参考如下代码:

from bs4 import BeautifulSoup
soup = BeautifulSoup('<b class="boldest">Extremely bold</b>')
print(tag.attrs)

输出效果如下图所示:

tag的属性可以被添加,删除或修改. 再说一次, tag的属性操作方法与字典一样,请参考如下代码:

tag['class'] = 'verybold'
tag['id'] = 1
tag
# <blockquote class="verybold" id="1">Extremely bold</blockquote>

del tag['class']
del tag['id']
tag
# <blockquote>Extremely bold</blockquote>

tag['class']
# KeyError: 'class'
print(tag.get('class'))
# None

3)多属性

在很多情况下,我们会给某一个属性,赋给多个值,这种情况最多的是应用在class属性上。由于class属性是设定元素的样式,而样式表本身就是“层叠式样式表“是需要叠加的,所以在class这个属性上多个属性值的情况非常常见,请参照如下代码:

css_soup = BeautifulSoup('<p class="body strikeout"></p>')
css_soup.p['class']
# ["body", "strikeout"]

如果某个属性看起来好像有多个值,但在任何版本的HTML定义中都没有被定义为多值属性,那么Beautiful Soup会将这个属性作为字符串返回,请参照如下代码:

id_soup = BeautifulSoup('<p id="my id"></p>')
id_soup.p['id']
# 'my id'

将tag转换成字符串时,多值属性会合并为一个值,请参照如下代码:

rel_soup = BeautifulSoup('<p>Back to the <a rel="index">homepage</a></p>')
rel_soup.a['rel']
# ['index']
rel_soup.a['rel'] = ['index', 'contents']
print(rel_soup.p)
# <p>Back to the <a rel="index contents">homepage</a></p>

3.1.2 NavigableString

在bs4中NavigableString代表字符串类型,字符串常被包含在tag内.Beautiful Soup用 NavigableString 类来包装tag中的字符串,请参考如下代码:

from bs4 import BeautifulSoup
soup = BeautifulSoup('<b class="boldest"><a>Extremely bold</a></b>')
tag = soup.b
print(tag.string)
print(type(tag.string))
# <class 'bs4.element.NavigableString'>
# b

输出结果如下图所示:

tag中包含的字符串不能编辑,但是可以被替换成其它的字符串,用 replace_witch() 方法:

from bs4 import BeautifulSoup
soup = BeautifulSoup('<b class="boldest"><a>Extremely bold</a></b>')
tag = soup.b
tag.string.replace_with("No longer bold")
print(tag)

输出结果如下图所示:

3.1.3 BeautifulSoup

BeautifulSoup 对象表示的是一个文档的全部内容.大部分时候,可以把它当作 Tag 对象,它支持 遍历文档树 和 搜索文档树 中描述的大部分的方法.因为 BeautifulSoup 对象并不是真正的HTML或XML的tag,所以它没有name和attribute属性.但有时查看它的 .name 属性是很方便的,所以 BeautifulSoup 对象包含了一个值为 “[document]” 的特殊属性 .name,请参考如下代码:

soup.name
# u'[document]'

3.1.4 Comment

请参考如下代码

markup = "<b><!--Hey, buddy. Want to buy a used parser?--></b>"
soup = BeautifulSoup(markup)
comment = soup.b.string
type(comment)
# <class 'bs4.element.Comment'>

输出结果如下图所示:

猜你喜欢

转载自blog.csdn.net/amao1998/article/details/82585319
今日推荐