Beautiful Soup简介与安装
简介
简单来说,Beautiful Soup是python的一个库,最主要的功能是从网页抓取数据。官方解释如下:
Beautiful Soup提供一些简单的python式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。
Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。你不需要考虑编码方式,除非文档没有指定一个编码方式,这时Beautiful Soup就不能自动识别编码方式了。然后你仅仅需要说明一下原始编码方式就可以了。
Beautiful Soup已成为和lxml、html6lib一样出色的python解释器,为用户灵活地提供不同的解析策略或强劲的速度。
安装
Beautiful Soup3目前已经停止开发,推荐在现在的项目中使用Beautiful Soup 4,不过它已经被移植到BS4了,也就是说导入时我们需要 import bs4。所以这里我们用的版本是 Beautiful Soup 4.3.2 (简称BS4)。
可以利用 pip 或者 easy_install来安装,以下两种方法均可:
easy_installbeautifulsoup4
pip installbeautifulsoup4
安装小测
本文使用的网页内容如下,demo.html。也可以直接从它的链接中获取:https://python123.io/ws/demo.html。
<html>
<head>
<title>This is a python demo page</title>
</head>
<body>
<p class="title"><b>The demo python introduces several python courses.</b></p>
<p class="course">Python is a wonderful general‐purpose programming language. You can learn Python from novice to professional by tracking the following courses:
<a href="http://www.icourse163.org/course/BIT‐268001" class="py1"id="link1">Basic Python</a>
and <a href="http://www.icourse163.org/course/BIT‐1001870001" class="py2"id="link2">Advanced Python</a>.</p>
</body>
</html>
Beautiful Soup库的基本元素
Beautiful Soup库是解析、遍历、维护“标签树”的功能库。一个Beautiful Soup类对应一个HTML/XML文档的全部内容。
from bs4 importBeautifulSoup;
soup =BeautifulSoup(demo, 'html.parser');或者
soup2 = BeautifulSoup(open(“demo.html”),'html.parser');
如上,构造一个BeautifulSoup类的参数有两个,第一个是html/xml的文档内容,可以是本地文件,也可以是使用requests库从url上获取下来的页面内容。第二个是BeautifulSoup库的解析器,默认为html.parser,它是python内置的标准库。也可以安装其他库。
解析器 | 使用方法 | 条件 |
bs4的HTML解析器 | BeautifulSoup(mk,'html.parser') | 安装bs4库 |
lxml的HTML解析器 | BeautifulSoup(mk,'lxml') | pip install lxml |
lxml的XML解析器 | BeautifulSoup(mk,'xml') | pip install lxml |
html5lib的解析器 | BeautifulSoup(mk,'html5lib') | pip install html5lib |
Html中一个标签的大致组成如下图所示,有标签名,属性,以及标签之间的内容等一些元素组成。所以对应的Beautiful Soup解析库也有类似的基本元素。
BeautifulSoup类的基本元素
基本元素 | 说明 |
Tag | 标签,最基本的信息组织单元,分别用<>和</>标明开头和结尾 |
Name | 标签的名字,<p>…</p>的名字是'p',格式:<tag>.name |
Attributes | 标签的属性,字典形式组织,格式:<tag>.attrs |
NavigableString | 标签内非属性字符串,<>…</>中字符串,格式:<tag>.string |
Comment | 标签内字符串的注释部分,一种特殊的Comment类型 |
Tag
任何存在于HTML语法中的标签都可以用soup.<tag>访问获得当HTML文档中存在多个相同<tag>对应内容时,soup.<tag>返回第一个。
Tag的名字(name)
标签<a>…</a>的名字就是’a’, 标签<title>…</title>的名字就是’title’。 soup 对象本身比较特殊,它的 name 即为 [document],对于其他内部标签,输出的值便为标签本身的名称。
Tag的属性(attrs)
一个<tag>可以有0或多个属性,字典类型。如果我们想要单独获取某个属性,可以使用名称索引。还可以利用get方法,传入属性的名称,二者是等价的。我们可以对这些属性和内容等等进行修改,例如:soup.p['class'] = ‘newClass’; 还可以对这个属性进行删除,例如:del soup.p['class']。
Tag的标签内非属性字符串
Tag的NavigableString,标签内非属性字符串,也就是tag的内容。NavigableString可以跨越多个层次。
Tag的Comment
标签内字符串的注释部分,一种特殊的Comment类型。Html的注释形式为:<!-- -->。
基于bs4库的HTML内容遍历方法
标签树的下行遍历
属性 | 说明 |
.contents | 子节点的列表,将<tag>所有儿子节点存入列表 |
.children | 子节点的迭代类型,与.contents类似,用于循环遍历儿子节点 |
.descendants | 子孙节点的迭代类型,包含所有子孙节点,用于循环遍历 |
BeautifulSoup类型是标签树的根节点。
.children和.descendants属性返回的是迭代类型,不能直接使用,必须使用循环,这样遍历的就是某个Tag的所有子节点,或者所有子孙节点。
遍历儿子节点
for child insoup.body.children:
print(child)
遍历子孙节点
for child insoup.body.descendants:
print(child)
标签树的上行遍历
属性 | 说明 |
.parent | 节点的父亲标签 |
.parents | 节点先辈标签的迭代类型,用于循环遍历先辈节点 |
标签树的平行遍历
属性 | 说明 |
.next_sibling | 返回按照HTML文本顺序的下一个平行节点标签 |
.previous_sibling | 返回按照HTML文本顺序的上一个平行节点标签 |
.next_siblings | 迭代类型,返回按照HTML文本顺序的后续所有平行节点标签 |
.previous_siblings | 迭代类型,返回按照HTML文本顺序的前续所有平行节点标签 |
首先需要注意的就是:只有同一个父节点下的各个节点之间才称作平行关系。并且标签之间的内容,即.string,也会被当作一个节点被遍历。
类似于.children和.descendants属性的使用,循环遍历所以的平行节点:
遍历后续节点
forsibling in soup.a.next_sibling:
print(sibling)
遍历前续节点
forsibling in soup.a.previous_sibling:
print(sibling)