当前位置: 首页 » Python(人生苦短) » py_module » beautifulsoup–解析html

beautifulsoup–解析html

[文章目录] x

BeautifulSoup库是解析、遍历、维护“标签树”的功能库

一、简介

安装

二、Beautiful Soup库的基本元素

三、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
html5lib的解析器 BeautifulSoup(mk,'html5lib') pip install html5lib

四、BeautifulSoup类的基本元素

基本元素 说明
Tag 标签,最基本的信息组织单元,分别用<>和</>标明开头和结尾
Name 标签的名字,<p>...</p>的名字是'p',格式:<tag>.name
Attributes 标签的属性,字典形式组织,格式:<tag>.attrs
NavigableString 标签内非属性字符串,<>...</>中字符串,格式:<tag>.string
Comment 标签内字符串的注释部分,一种特殊的Comment类型

一个可以有0或多个属性,字典类型

Comment是一种特殊类型

五、 基于bs4库的HTML内容遍历方法

HTML基本格式
标签树的下行遍历
属性 说明
.contents 子节点的列表,将所有儿子节点存入列表
.children 子节点的迭代类型,与.contents类似,用于循环遍历儿子节点
.descendants 子孙节点的迭代类型,包含所有子孙节点,用于循环遍历

标签树的上行遍历
.parent 节点的父亲标签
.parents 节点先辈标签的迭代类型,用于循环遍历先辈节点

标签树的平行遍历

.next_sibling 返回按照HTML文本顺序的下一个平行节点标签
.previous_sibling 返回按照HTML文本顺序的上一个平行节点标签
.next_siblings 迭代类型,返回按照HTML文本顺序的后续所有平行节点标签
.previous_siblings 迭代类型,返回按照HTML文本顺序的前续所有平行节点标签

 

六、 基于bs4库的HTML格式输出

能否让HTML内容更加“友好”的显示?
bs4库的prettify()方法

bs4库将任何HTML输入都变成utf‐8编码
Python 3.x默认支持编码是utf‐8,解析无障碍

七、 信息的抓取

信息标记的三种形式
XML
Tag: <img src=“china.jpg” size=“10”> ... </img>
img: 名称 Name
src,size: 属性 Attribute

JSON (JavsScript Object Notation)
有类型的键值对 key:value
多值用[,]组织
键值对嵌套用{,}

YAML
无类型键值对 key:value
缩进表达所属关系
‐ 表达并列关系
| 表达整块数据 # 表示注释

三种信息标记的比较
XML 最早的通用信息标记语言,可扩展性好,但繁琐 (Internet上的信息交互与传递)
JSON 信息有类型,适合程序处理(js),较XML简洁 (移动应用云端和节点的信息通信,无注释)
YAML 信息无类型,文本信息比例最高,可读性好 (各类系统的配置文件,有注释易读)

信息提取的一般方法
方法一:完整解析信息的标记形式,再提取关键信息(XML JSON YAML)
需要标记解析器,例如:bs4库的标签树遍历
优点:信息解析准确 缺点:提取过程繁琐,速度慢

方法二:无视标记形式,直接搜索关键信息 (搜索)
对信息的文本查找函数即可
优点:提取过程简洁,速度较快 缺点:提取结果准确性与信息内容相关

融合方法:结合形式解析与搜索方法,提取关键信息(XML JSON YAML 搜索)
需要标记解析器及文本查找函数

<>.find() 搜索且只返回一个结果,同.find_all()参数
<>.find_parents() 在先辈节点中搜索,返回列表类型,同.find_all()参数
<>.find_parent() 在先辈节点中返回一个结果,同.find()参数
<>.find_next_siblings() 在后续平行节点中搜索,返回列表类型,同.find_all()参数
<>.find_next_sibling() 在后续平行节点中返回一个结果,同.find()参数
<>.find_previous_siblings() 在前序平行节点中搜索,返回列表类型,同.find_all()参数
<>.find_previous_sibling() 在前序平行节点中返回一个结果,同.find()参数

 

八、报错:

1.Invalid conversion specification

当中文字符宽度不够时,采用西文字符填充;中西文字符占用宽度不同
采用中文字符的空格填充 chr(12288)

python 2
chr( K ) 将编码K 转为字符,K的范围是 0 ~ 255
python 3
chr( K ) 将编码K 转为字符,K的范围是 0 ~ 65535

参考资料:

北京理工大学嵩天老师的课件


下一篇 :

上一篇 :

暂无评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注

$(document).ready(function(){ $("#article-index").css('display','none');});