本文主要内容:BeautifulSoup库的介绍,基本元素,标签树的遍历
安装:pip install BeautifulSoup4
<html>
<body>标签树</body>
...
</html>
BeautifulSoup库是解析、遍历、维护“标签树”的功能库
<p> ...</p> : 标签 Tag
<p class="title"> ...</p>
p 名称 Name 成对出现 ; class = "title"属性 Attribute 0个或多个
Beautiful Soup库也叫beautifulsoup4库或bs4库,主要是用BeautifulSoup类
约定引用方式如下:
from bs4 import BeautifulSoup
import bs4
BeautifulSoup类对应了一个HTML/XML文档的全部内容
from bs4 import BeautifulSoup
soup = BeautifulSoup("<html>...</html>","html.parse")
soup = BeautifulSoup(opem("filepath"),"html.parser")
# html.parser为解析器
BeautifulSoup库的解析器
解析器 使用方法 条件
bs4的解析器 BeautifulSoup(mk,"html.parser") pip install BeautifulSoup4
lxml的HTML解析器 BeautifulSoup(mk,"lxml") pip install lxml
lxml的XML解析器 BeautifulSoup(mk,"lxml") pip install lxml
htmllib5解析器 BeautifulSoup(mk,"htmllib5") pip install html5lib
BeautifulSoup类的基本元素:
Tag标签,最基本的信息组织单元,分别用<>..</>标明开头和结尾
Name标签的名字,<p>..</p>的名字是p,格式:<tag>.name
Attributes标签的属性,class、id等,字典形式组织,格式:<tag>.attrs
NavigableString标签内的非属性字符串,<>..</>中的字符串
Comment标签内字符串的注释部分,一种特殊的Comment类型
示例:
<html>
<head>
<title>403 Forbidden</title>
</head>
<body bgcolor="white">
<h1>403 Forbidden</h1>
<p>
You don't have permission to access the URL on this server. Sorry for the inconvenience.
</p>
<p>
Please report this message and include the following information to us.
Thank you very much!
</p>
<table>
<tr>
<td> URL: </td>
<td> https://www.jianshu.com/ </td>
</tr>
<tr>
<td> Server: </td>
<td> zurich </td>
</tr>
<tr>
<td> Date: </td>
<td> 2019/12/24 11:49:40 </td>
</tr>
</table>
</body>
</html>
将请求返回的html代码用BeautifulSoup库来解析
import requests
from bs4 import BeautifulSoup
r = requests.get('https://www.jianshu.com')
r.encoding ='utf-8' #防止中文乱码
soup = BeautifulSoup(r.text,'html.parser')
print(soup.prettify()) #标签格式化换行输出
Tag标签解析:
任何存在与HTML中的标签都可以使用soup.<tag>来访问获得,当html文档中同事存在多个<tag>标签时,返回第一个
soup.p
输出:<p>You don't have permission to access the URL on this server. Sorry for the inconvenience.<br/>
Please report this message and include the following information to us.<br/>
Thank you very much!</p>
Tag的标签名称解析:
每一个<tag>标签都有自己的名字,通过<tag>.name获取,字符串类型
soup.p.name
输出:'p'
标签的属性attrs解析:
一个标签可以有0个或多个标签属性,他们是字典类型
soup.body.attrs
输出:{'bgcolor': 'white'}
soup.body.attrs['bgcolor']
输出:'white'
Tag的NavigableString解析:
标签内的非属性字符串获取,可以跨越多个层级
soup.title.string
输出:'403 Forbidden'
Tag的Comment解析:
解析标签内的字符串的注释部分
html的内容遍历:
HTML是以标签树的形式来组织信息,标签书遍历一般有下行遍历,上行遍历和平行遍历
下行遍历:从当前节点往下遍历
.contents:子节点的列表,将所有儿子节点存入列表中(只能获取下一级儿子节点)
.children:子节点的迭代类型,与.contents类似,用于循环遍历儿子节点
.descendants:子孙节点的迭代类型,包含所有子孙结点,用于循环遍历(可以获取所有子节点)
用这三种方法来解析一下table中的内容:
a = soup.table.children
for child in a:
if isinstance(child,bs4.element.Tag): #排除非标签元素干扰
for i in child.children:
if isinstance(i,bs4.element.Tag):
print(i.string)
#contents属性与children类似
a = soup.table.descendants
for child in a:
if isinstance(child,str) and child !='\n':
print(child)
输出:
上行遍历:从当前节点向上遍历
.parent:节点的父亲标签
.parents:节点先辈标签的迭代类型,用于循环遍历先辈节点
#打印td的父级标签名称
for i in soup.td.parents:if i.parent is None:
break
else:
print(i.parent.name)
输出:table
body
html
[document]
平行遍历:获取当前节点的平级前、后一个或多个节点。
.next_sibling:返回按照HTML文本顺序的下一个平行节点标签
.previos_sibling:返回按照HTML文本顺序的上一个平行节点标签
.next_siblings:迭代类型,返回按照HTML文本顺序的后续所有平行节点标签
.previous_siblings:迭代类型,返回按照HTML文本顺序的前续所有平行节点标签