Bs4(获取内容和标签、搜索文档树、CSS选择器查询内容)
第三方的库。将复杂的HTML文档转化为一个复杂的树形结构,每个节点都是Python对象,所有对象都可以归纳为4种:
- Tag 有标签有内容
- NavigableString 只有内容,若有注释符号,则包含
- BeautifulSoup 全部文档内容
- Comment 标签里的内容,不包含注释符号
准备一个html文件,详情代码请看链接
https
一、经常使用
beautifulSoup(取出全部标签和内容,即文档)、string(取出内容)、按标签来(取出标签和内容)
二、使用大纲
1、Tag
print(bs.title) 有标签,有内容,
2、NavigableString 标签里的内容(字符串),若是有注释符号,就输出注释符号
print(bs.title.string) # 百度一下,你就知道
print(type(bs.title.string)) # <class 'bs4.element.NavigableString'>
只要内容
print(bs.a.attrs)
以键值对的方式,拿到一个标签里的所有属性
3、BeautifulSoup表示整个文档
print(bs)
4、comment 是一个特殊的NavigableString,输出的内容不包含注释符号
print(bs.a.string)
三、详细使用
1、导入import
并将html打开,保存在file中,读取file文件,并保存在HTML文档里。解析文档,制定解析器,保存在树形结构bs对象里进行遍历。
from bs4 import BeautifulSoup
file = open("baidu.html","rb") # 打开HTML
html = file.read() # 读取文件,保存在HTML文档里
bs = BeautifulSoup(html,"html.parser") # 解析文档,并制定解析器(此用HTML解析器html.parser),
# 形成一个树形结构,通过bs对象进行遍历
2、遍历全部文档(BeautifulSoup)
'''BeautifulSoup 全部文档内容'''
print(bs)
# print(type(bs)) # 4、<class 'bs4.BeautifulSoup'>
3、根据标签Tab获取内容,获取内容和标签
# 打印标签及其内容,拿到第一个内容
print(bs.a) # <a class="mnav" href="http://news.baidu.com" name="tj_trnews"><!--新闻--></a>
# print(type(bs.a)) # 还是Tab,<class 'bs4.element.Tag'>
print(bs.head)
# print(type(bs.head)) # <class 'bs4.element.Tag'> 标签、内容
print(bs.title) # <title>百度一下,你就知道</title>
# print(type(bs.title)) # <class 'bs4.element.Tag'>
3、string(2种获取标签里的内容)
3-1NavigableString:标签里的内容
print(bs.title.string) # 百度一下,你就知道
print(type(bs.title.string)) # 2、<class 'bs4.element.NavigableString'>标签里的内容(字符串)
3-2Comment:输出标签里的"内容"
Comment是一个特殊的NavigableString,输出的内容不包含注释符号
print(bs.a.string) # 新闻
print(type(bs.a.string)) # <class 'bs4.element.Comment'>
# 对比:(注释,并不能被取出来!还是Tab类型)
print(bs.a) # <a class="mnav" href="http://news.baidu.com" name="tj_trnews"><!--新闻--></a>
print(type(bs.a)) # <class 'bs4.element.Tag'>
4、以键值对的形式获取标签内的所有元素
print(bs.a.attrs) # 3、{'class': ['mnav'], 'href': 'http://news.baidu.com', 'name': 'tj_trnews'}拿到一个标签里的所有属性和值
print(bs) # 获取所有内容,包括标签
四、Bs4的应用
4-1 遍历文档树
精准度不如搜索!!常用string、contents
#遍历文档树:
#1、contents:获取Tag的所有子节点,返回一个list
print(bs.head.contents)
print(bs.head.contents[1]) # 下标从0开始,<meta charset="utf-8"/>
#2、children:获取Tag的所有子节点,返回一个生成器
for child in bs.body.children:
print(child)
#3、desecondants:获取Tag的所有子孙节点
#4、strings:若Tag包含多个字符串,获取所有内容
#5、还有很多,如父节点parent,兄弟节点previous_siblings\next_sibling,上一个previous_sibling、下一个节点next_sibling
4-2 搜索文档树
1、find_all()配合字符串、正则表达式、自己定义的方法查询出特定形式的内容!!
2、
3、
4-2-1 find_all()
配合字符串、正则表达式、自己定义的方法查询出特定形式的内容!!
4-2-1-1 配合字符串查询出特定形式的内容
字符串过滤:会查找与字符串完全匹配的内容
t_list = bs.find_all("指定字符串")
t_list = bs.find_all("a")
print(t_list) # 找到所有a标签,放置到list
4-2-1-2 配合正则表达式查询出特定形式的内容
正则表达式搜索,find_all可以理解为search,搜索所有(不常用)
t_list = bs.find_all(re.compile("指定字符串"))
import re
t_list = bs.find_all(re.compile("a"))
print(t_list) # 包含a的都会被显示出来,一个大的列表
4-2-1-3 配合自定义的方法查询出特定形式的内容
形式:
def 函数名(参数):
return tag.has_attr属性名(“搜索的属性名”)
t_list = bs.find_all(函数名)
def name_is_exits(tag): # 定义函数
return tag.has_attr("name") # attr属性
t_list = bs.find_all(name_is_exits)
# for item in t_list:
# print(item) # 打印一个列表,显示更清楚
4-2-2 kwargs:参数,指定参数进行搜索
t_list = bs.find_all(指定参数="指定值")
.
参数:可以是id、class、href等参数名,再等于特定值。
t_list = bs.find_all(id="head") # 写指定参数
t_list = bs.find_all(class_=True)
t_list = bs.find_all(href="http://news.baidu.com")
for item in t_list:
print(item) # 打印一个列表,显示更清楚
4-2-3 text参数,得到指定文本
t_list = bs.find_all(text="指定文本")
import re
# t_list = bs.find_all(text="hao123") # 特定文本内容,搜索到
# t_list = bs.find_all(text=["hao123","地图","贴吧"])
t_list = bs.find_all(text=re.compile("\d")) # 应用正则表达式来查找包含特定文本的内容(标签里的字符串)
# 字符串中数字的文本,\d表示数字
for item in t_list:
print(item)
4-2-4 limit参数,限定得到信息的个数
t_list = bs.find_all("特定形式字符串",limit=指定查询信息个数)
t_list = bs.find_all("a",limit=3)
for item in t_list:
print(item)
4-2-5 使用css选择器查询内容
bs.select(“标签、类名(.类名)、id(#id名)、属性(标签[属性=’ '])、子标签(父标签 > 子标签 )、兄弟标签(.兄弟class标签 ~ .兄弟class标签)”)
t_list = bs.select('title') # 通过标签来查找
t_list = bs.select(".bri") # 通过类名查找
t_list = bs.select("#u1") # 通过id查找
t_list = bs.select("a[name='tj_trmap']") # 通过属性来查找
t_list = bs.select("head > title") # 通过子标签来查找
for item in t_list:
print(item)
通过兄弟标签进行查找
t_list = bs.select(".mnav ~ .bri") # 通过兄弟标签来查找
print(t_list[0].get_text()) # 下标
五、总结
1、搜索文档树
一、find_all()配合字符串、正则表达式、自己定义的方法查询出特定形式的内容
二、kwargs:参数,指定参数进行搜索
三、text参数:得到指定文本
四、limit参数,限定得到信息的个数
2、import bs4
from bs4 import BeautifulSoup
file = open("baidu.html","rb") # 打开HTML
html = file.read() # 读取文件,保存在HTML文档里
bs = BeautifulSoup(html,"html.parser") # 解析文档,并制定HTML的解析器html.parser
3、使用bs4
一、BeautifulSoup 全部文档内容
二、根据标签Tab获取内容,获取内容和标签
三、string(2种)
1、NavigableString:标签里的内容
2、Comment:输出标签里的"内容",Comment是一个特殊的NavigableString,输出的内容不包含注释符号
四、以键值对获取标签里的所有内容
本文介绍了Python的BeautifulSoup库,详细讲解了如何使用Bs4获取HTML内容和标签,包括遍历文档树、使用CSS选择器查询内容,以及find_all方法的各种用法,如配合字符串、正则表达式和自定义方法进行搜索。
531

被折叠的 条评论
为什么被折叠?



