By 一页编程
我们知道BeautifulSoup库是能够解析html和xml文件的功能库,那么我们该怎么理解它呢?
我们以html文件为例,任何一个html文件,如果打开它的源代码,我们都能看到。它是由一组尖括号构成的标签组织起来的,这里边每一对尖括号形成了一个标签,而标签之间存在上下游关系,形成了一个标签树。
所以我们可以说BeautifulSoup库是解析、遍历、维护标签树的功能库。只要你提供的文件是标签类型,那么BeautifulSoup库都可以做很好的解析。
标签的基本结构
我们以p标签为例。
<p class="title">......</p>
p标签是以一对尖括号形成的一个标签类型,单词p就是这个标签的名称。除了表示标签名称、范围的<p>
和</p>
,还有一个键值对构成的属性域:class="title"
。这样的一个格式构成了标签的基本结构。
理解BeautifulSoup
BeautifulSoup库本身解析的是html和xml文档,那么这个文档与标签树是一一对应的,经过了BeautifulSoup类的处理,html或xml文档这样的标签树,就被转换成一个BeautifulSoup类。BeautifulSoup类就是能够代表标签树的一个类型。
事实上我们认为html文档、标签树和BeautifulSoup类这三者是等价的。在这个等价的基础上我们就可以通过BeautifulSoup类,使得标签树形成了一个变量,而对这个变量的处理就是对标签树的相关的处理。
from bs4 import BeautifulSoup
soup = BeautifulSoup(‘<html>data</html>’, 'html.parser')
soup2 = BeautifulSoup(open('D://demo.html'), 'html.parser')
解析器
之前的例子我们使用了html解析器,那么除了html解析器,BeautifulSoup库也可以使用四种其他的解析器。
解析器 | 使用方法 | 条件 |
---|---|---|
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 |
BeautifulSoup基本元素
下面我们介绍一下BeautifulSoup类的基本元素。
基本元素 | 说明 |
---|---|
Tag | 标签,最基本的信息组织单元,分别用<>和</>标明开头和结尾 |
Name | 标签的名字,<p>...</p> 的名字是’p‘,格式<tag>.name |
Attributes | 标签的属性,字典组织形式,格式<tag>.attrs |
NavigableString | 标签内非属性字符串,格式<tag>.string |
Comment | 标签内字符串的注释部分,一种特殊的Comment类型 |
Tag
标签是BeautifulSoup类里边的最基本的信息组织单元,它与html和xml文档中的一对尖括号相对应,它分别是用尖括号和尖括号中代反斜杠来标明开头和结尾。
>>> soup = BeautifulSoup(demo, 'html.parser')
>>> soup.title
<title>This is a python demo page</title>
>>> soup.a
<a href="http://www.jianshu.com/nb/11366912 class=" id="link1" py1"="">Python Crawler</a>
>>>
可以看到soup.title
返回了title标签的内容,soup.a
返回了a标签的内容。
Name
>>> soup = BeautifulSoup(demo, 'html.parser')
>>> soup.title.name
'title'
>>> soup.a.name
'a'
>>>
可以通过对任何一个标签使用点name的方式获得它的名字,那么这个名字显示出来是字符串类型。
Attributes
>>> soup = BeautifulSoup(demo, 'html.parser')
>>> tag = soup.a
>>> tag.attrs
{'href': 'http://www.jianshu.com/nb/11366912 class=', 'py1"': '', 'id': 'link1'}
>>>
我们知道标签的属性是在标签中标明标签特点的相关区域,以字典形式来组织。可以用.attrs
来获得属性的信息。
NavigableString
在标签尖括号的之间,是一种字符串,我们可以用.string
来获得其中的内容。
Comment
Comment是一种特殊的标签形式,表示html中的注释。