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()参数 |
网友评论