1.什么是BeautifulSoup
Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库,它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式。Beautiful Soup会帮你节省数小时甚至数天的工作时间.
2.使用方法
1.对象的种类和使用
# -*-coding:utf-8 -*-
# 作者:不懂先生
# 日期: 2021/8/3
# BeautifulSoup4 将复杂HTML文档转换成一个复杂的树形结构,每个节点都是python对象,所有对象可以归结为4种
#-Tag
#-NavigableString
#-BeautifulSoup
#-Comment
import re
from bs4 import BeautifulSoup
file = open("./index.html","rb") #当前文件夹是 ./ rb 以二进制读取
html = file.read().decode("utf-8")
bs = BeautifulSoup(html,"html.parser")# 第一个是解析文件的类型 第二个是用什么解析器 解析html 树形结构
# 1.Tag 标签及其内容:拿到它的第一个内容
print(bs.title)
print(bs.a)#只输出第一个找到的
print(bs.head) #输出head标签里面的内容
print(type(bs.head))
#2.NavigableString 标签里面的内容(字符串)
print(bs.title)#标签一级里面内容都打印
print(bs.title.string)#只要里面的内容
# name 属性 拿到标签(tag)的名字
print(bs.title.name)#输出title
# attrs 拿到标签里面所有的属性和属性值 以字典保存
print(bs.a.attrs)
#3.BeautifulSoup 表示整个文档 整个html文档内容
print(type(bs))#类型<class 'bs4.BeautifulSoup'>
print(bs.name)#名字叫做document
print(bs.attrs)
print(bs)
# 4.Comment 是一个特殊的NavigableString 注 释 输出的时候自己识别注释,并去掉注释符号 输出注释的内容
print(bs.a.string)
print(type(bs.a.string))#<class 'bs4.element.Comment'>
文档的遍历 contents:获取Tag的所有子节点 返回一个list
tar的.content属性可以将tag的子节点以列表的方式输出
print(bs.head.contents)
用列表索引来获取他的某一个元素
print(bs.head.contents[0])
print(bs.head.contents[1])
# children:获取Tag的所有子节点,返回一个生成器
for child in bs.body.children:
print(child)
# 文档的搜索
# (1)find_all() 存放到数组里面 称为元素
字符串过滤:会查找与字符串完全匹配的内容
t_list = bs.find_all("a") #存放到列表里面 一个a是一个列表元素
print(t_list)
# (2)正则表达式搜索:search()方法来匹配内容
import re
t_list = bs.find_all(re.compile("a"))#包含a的标签会整个显示出来 如head 整个标签是一个列表元素
print(t_list)
# 方法:传入一个函数(方法),根据函数的要求来搜索
def name_is_exists(tag): #tag 标签 看是否有name这个属性
return tag.has_attr("name")#有name属性的以列表元素形式输出
t_list = bs.find_all(name_is_exists)#标签里面含有name的找出来
for item in t_list:
print(item) #遍历输出
# 2.kwargs 参数 指定参数搜索
t_list = bs.find_all(id="u1")# 找出id="u1"的所有标签 并输出里面所有内容
print(t_list)
t_list = bs.find_all(class_= True)#存在class这个属性则输出
print(t_list)
t_list = bs.find_all(href="http://www.bossdong.cn/zhaopian")
print(t_list)
# 3.text 文本参数 标签输出的内容
t_list = bs.find_all(text="相册")
t_list = bs.find_all(text=["相册","博客","吉他谱","nnini"])#有则输出 没有不输出
t_list = bs.find_all(text=re.compile("/d"))#应用正则表达式来寻找包含特定文本的内容(标签里面的字符串)
for i in t_list:
print(i)
# 4.limit 参数
t_list = bs.find_all("a",limit=2)#只要前两个
for i in t_list:
print(i)
# 5.css选择器
t_list = bs.select("title") #通过标签来寻找 列表形式存储
t_list = bs.select(".item-logo") #通过类名来寻找
t_list = bs.select("#u1") 通过ID来寻找
t_list = bs.select("a[class="bossdong-color-item"]") #先选择a标签 并且里面还有含有bossdong-color-item这个属性,通过属性来寻找
t_list = bs.select("head > title") #通过子标签来寻找
t_list = bs.select(".fa-music ~ .light") #通过兄弟类名来寻找
print(t_list[0].get_text()) #get_text()得到文本内容