005 Python网络爬虫与信息提取 Beautiful Soup库入门
Beautiful Soup库的中文文档: https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html#
[A] Beautiful Soup库简介
Beautiful Soup库,也叫 beautifulsoup4 库 或 bs4 库
Beautiful Soup库可以对爬取的任何 html 和 XML 进行解析,它将爬取的内容当做一锅汤,可以巧妙地煲好这锅汤。
[B] Beautiful Soup库安装
1. Pycharm 库安装
2. 在终端打开 python 运行环境,执行指令:pip install beautifulsoup4
[C] Beautiful Soup库的而基本使用
import requests
# 1. 获取网站的html代码,存储在demo中
url = 'http://python123.io/ws/demo.html'
r = requests.get(url)
demo = r.text
print(type(demo)) # 返回<class 'str'>
# 2. 利用bs库处理html代码
from bs4 import BeautifulSoup
soup = BeautifulSoup(demo, 'html.parser')
print(type(soup)) # 返回<class 'bs4.BeautifulSoup'>
print(soup.prettify()) # 返回排列好的html代码(未被丑化的)
[D] Beautiful Soup库的基本元素
1. Beautiful Soup库是解析,遍历,维护 "标签树" 的功能库,只要提供的是标签树,该库都能对其进行解析
2. 首先,html代码 或者 标签树 被转化成BeautifulSoup类,然后就可以进行操作了
Beautiful Soup 库解析器有四种:
解析器 | 使用方法 | 使用条件 |
bs4的HTML解析器 | BeautifulSoup(mk, 'html.parser') | 安装bs4库 |
lxml的HTML解析器 | BeautifulSoup(mk, 'lxml') | pip install lxml |
lxml的的XML解析器 | BeautifulSoup(mk, 'xml') | pip install lxml |
html6lib的解析器 | BeautifulSoup(mk, 'html5lib') | pip install html5lib |
Beautiful Soup类的基本元素:
基本元素 | 说明 |
Tag | 标签,最基本的信息组织单元,分别用<>和</>表明开头和结尾 |
Name | 标签的名字,<p>...</p>的名字为'P', 格式为:<tag>.name |
Attributes | 标签的属性,字典形式组织,格式: <tag>.attrs |
NavigableString | 标签内非属性字符串,<>...</>之间的字符串,格式为:<tag>.string |
Comment | 标签内字符串的注释部分,一种特殊的Comment类型 |
text | 返回字符串,内容为所解析的标签内的文本 |
BeautifulSoup类包含了所解析的html页面的所有信息,可以通过调用相应属性来获取指定内容
import requests
from bs4 import BeautifulSoup
# 1. 首先通过requests库爬取html代码
r = requests.get('http://python123.io/ws/demo.html')
demo = r.text
# 2. 煲汤
soup = BeautifulSoup(demo, 'html.parser')
1. BeautifulSoup类.标签名 通过标签名获取指定标签的内容,若有多个同类标签免责返回第一个
如:soup.p 获取p标签的完整信息
// 返回 <p class="title"><b>The demo python introduces several python courses.</b></p>
2. BeautifulSoup类.标签名.name 获取指定标签的名字
如:soup.p.name 获取p标签的名称
// 返回 p
3. BeautifulSoup类.标签名.attrs 获取指定标签的属性(即行内属性)
如:soup.a.attrs 获取a标签的属性对象
// 返回 {'href': 'http://www.icourse163.org/course/BIT-268001', 'class': ['py1'], 'id': 'link1'}
4. BeautifulSoup类.标签名.string 获取指定标签内的内容字符串
如:soup.p.string 获取指定标签内的文本内容(可穿透嵌套的标签
5. BeautifulSoup类.标签名.string 获取指定标签内的注释部分
如:soup.p.string 获取p标签终中的注释内容
注意:4 和 5 方法一样但是获取的内容一个是内容信息,一个是注释信息,需要用type()方法来判断具体是哪一类信息
6. BeautifulSoup类.text 或 BeautifulSoup类.p.text
如:soup.text,soup.p.text 获取所解析内容的标签内的文本,或者指定标签内的文本,返回值为字符串
[E] 基于bs 库的 HTML内容遍历方法
1. HTML标签树,可以看作一个树结构
2. 标签树的遍历分为三种方式:下行遍历,上行遍历和平行遍历
3. 三种遍历方式图解如图:
标签树的下行遍历:
属性 | 节点 |
.contents | 子节点的列表,将<tag>所有子节点存入一个列表 |
.children | 子节点的迭代类型,与.contents类似,用于循环遍历子节点 |
.descendants | 子孙节点的迭代类型,包含所有子孙节点,用于循环遍历 |
标签树的上行遍历:
属性 | 说明 |
.parent | 节点的父亲标签 |
.parents | 节点先辈标签的迭代烈性,用于循环遍历先辈节点 |
标签的上行遍历代码示例:
import requests from bs4 import BeautifulSoup # 1. 首先通过requests库爬取html代码 r = requests.get('http://python123.io/ws/demo.html') demo = r.text # 2. 煲汤 soup = BeautifulSoup(demo, 'html.parser') for parent in soup.a.parents: if parent is None: print(parent) else: print(parent.name)
标签树的平行遍历:
属性 | 说明 |
.next_sibling | 返回按照HTML文本顺序的下一个平行节点标签 |
.previous_sibling | 返回按照HTML文本顺序的上一个平行节点标签 |
.next_siblings | 迭代类型,返回按照HTML文本顺序的后续所有平行节点标签 |
.previous_siblings | 迭代类型,返回按照HTML文本顺序的前续所有平行节点标签 |
[F] 基于bs4库的HTML格式输出和编码
1. 如何让HTML页面更友好的显示
prettify()方法,为HTML标签添加换行符,使得代码打印时的结构更加清晰
2. bs4库将读入的任何HTML代码和字符串,都进行utf-8编码