Python学习之Bs4(获取内容和标签、搜索文档树、CSS选择器查询内容)

本文介绍了Python的BeautifulSoup库,详细讲解了如何使用Bs4获取HTML内容和标签,包括遍历文档树、使用CSS选择器查询内容,以及find_all方法的各种用法,如配合字符串、正则表达式和自定义方法进行搜索。

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,输出的内容不包含注释符号
四、以键值对获取标签里的所有内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值