4-Beautiful Soup库的使用
2018-08-10 本文已影响2人
撸撸很乖张
bs4的基本适用
from bs4 import BeautifulSoup
html = """
<html lang="en">
<head>
<meta charset="UTF-8">
<title>bs4 demo</title>
</head>
<body>
<div class='div_demo' id='div'>
<p><span>Hello</span> world</p>
<a href="">新闻</a>
</div>
<div> </div>
</body>
"""
soup = BeautifulSoup(html, 'lxml')
# 1.按tag查找
# print(soup.get_text())
# print(soup.title.get_text())
# 2.find
soup.find(name='a')
soup.find(name='body').find(name='a')
# 3.获取元素文本
print(soup.div.p.get_text())
print(soup.div.p.string) # 节点不能再有子节点
# 4.获取属性值
print(soup.div.attrs) # {'class': ['div_demo'], 'id': 'div'}
print(soup.div.get('id')) # div
# 5.find_all findAll
soup.find_all(name='div', attrs={}, recursive=True, text='', class_='', limit=2)
"""
- name :tag name
- attrs:tag的属性
- recursive:是否递归 默认True
- text:按tag显示的内容查找
- limit:限制找到的结果的个数
"""
soup.find(name='div', attrs={}, recursive=True, text='', class_='')
print(soup.find(name='div', attrs={'class':'div_demo'}))
Beautiful Soup库的引用
Beautiful Soup对应一个HTML/XML文档的全部内容
from bs4 import BeautifulSoup
#两种引用的方法
soup = BeautifulSoup("<html>data</html>","html.parser")
soup2 = BeautifulSoup(open("D://demo.html"),"html.parser")
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 |
bs4库的prettify()方法
.prettify()为HTML文本<>及其内容增加\n,让页面显示更加友好。
.prettify()可用于标签,方法:<tag>.prettify()
print(soup.a.prettify())
BeautifulSoup类的基本元素
<p class=“title”> … </p>
| 基本元素 | s说明 |
|---|---|
| Tag | 标签,最基本的信息组织单元,分别用<>和</>标明开头和结尾 |
| Name | 标签的名字,<p>…</p>的名字是'p',格式:<tag>.name |
| Attributes | 标签的属性,字典形式组织,格式:<tag>.attrs |
| NavigableString | 标签内非属性字符串,<>…</>中字符串,格式:<tag>.string |
| Comment | 标签内字符串的注释部分,一种特殊的Comment类型 |
标签树的下行遍历
| 属性 | 说明 |
|---|---|
| .contents | 子节点的列表,将<tag>所有儿子节点存入列表 |
| .children | 子节点的迭代类型,与.contents类似,用于循环遍历儿子节点 |
| .descendants | 子孙节点的迭代类型,包含所有子孙节点,用于循环遍历 |
标签树的上行遍历
| 属性 | 说明 |
|---|---|
| .parent | 节点的父亲标签 |
| .parents | 节点先辈标签的迭代类型,用于循环遍历先辈节点 |
标签树的平行遍历
同一个父标签下的兄弟节点才是平行节点。
| 属性 | 说明 |
|---|---|
| .next_sibling | 返回按照HTML文本顺序的下一个平行节点标签 |
| .next_siblings | 迭代类型,返回按照HTML文本顺序的后续所有平行节点标签 |
| .previous_sibling | 返回按照HTML文本顺序的上一个平行节点标签 |
| .previous_siblings | 迭代类型,返回按照HTML文本顺序的前续所有平行节点标签 |
信息标记与提取方法
信息的标记
标记后的信息可形成信息组织结构,增加了信息维度
标记的结构与信息一样具有重要价值
标记后的信息可用于通信、存储或展示
标记后的信息更利于程序理解和运用
三种标记形式
-
XML
- 最早的通用信息标记语言,可扩展性好,但繁琐。
- Internet上的信息交互与传递
<img src=“china.jpg” size=“10” /> 空元素的缩写形式 <!‐‐ This is a comment, very useful ‐‐> 注释书写形式 <name> … </name> <name /> <!‐‐ ‐‐>
-
JSON
- 信息有类型,适合程序处理(js),较XML简洁。
- 移动应用云端和节点的信息通信,无注释。
# 有类型的键值对key:value “name” : “北京理工大学”Json实例:
{ “firstName” : “Tian” , “lastName” : “Song” , “address” : { “streetAddr” : “中关村南大街5号” , “city” : “北京市” , “zipcode” : “100081” } , “prof” : [ “Computer System” , “Security” ] }
-
YAML
- 信息无类型,文本信息比例最高,可读性好。
- 各类系统的配置文件,有注释易读。
# 无类型的键值对key:value
“name” : “北京理工大学”
# 缩进表达所属关系
name :
newName : 北京理工大学
oldName : 延安自然科学院
# ‐ 表达并列关系
name :
‐北京理工大学
‐延安自然科学院
# | 表达整块数据 # 表示注释
text: | #学校介绍
北京理工大学创立于1940年,前身是延安自然科学院,是中国共产党创办的第一所理工科大学,毛泽东同志亲
自题写校名,李富春、徐特立、李强等老一辈无产阶级革命家先后担任学校主要领导。学校是新中国成立以来
国家历批次重点建设的高校,首批进入国家“211工程”和“985工程”建设行列;在全球具有广泛影响力的英
国QS“世界大学500强”中,位列入选的中国大陆高校第15位。学校现隶属于工业和信息化部。
key : value
key : #Comment
‐value1
‐value2
key :
subkey : subvalue
YAML实例:
firstName : Tian
lastName : Song
address :
streetAddr : 中关村南大街5号
city : 北京市
zipcode : 100081
prof :
‐Computer System
‐Security
基于bs4的HTML内容查找
find_all()方法
<>.find_all(name, attrs, recursive, string, **kwargs)
∙ name : 对标签名称的检索字符串
∙ attrs: 对标签属性值的检索字符串,可标注属性检索
∙ recursive: 是否对子孙全部检索,默认True
∙ string: <>…</>中字符串区域的检索字符串
扩展方法
| 方法 | 说明 |
|---|---|
| <>.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()参数 |