一、介绍

Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup 3 目前已经停止开发,官网推荐在现在的项目中使用Beautiful Soup 4, 移植到BS4

1、安装 Beautiful Soup
pip3 install beautifulsoup4 基本使用
from bs4 import BeautifulSoup # 导入BeautifulSoup # html.parser内置标准库,不需要安装第三方模块,速度慢
soup=BeautifulSoup(res.text,'html.parser') 实例化得到对象 # 安装第三方库解析器
pip3 install lxml
soup=BeautifulSoup(res.text,'lxml') 实例化得到对象

中文文档

2、bs4的使用

文档模板
html_doc = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p id="my_p" class="title">hello<b id="bbb" class="boldest">The Dormouse's story</b>
</p> <p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p> <p class="story">...</p> import requests
from bs4 import BeautifulSoup soup=BeautifulSoup(html_doc,'lxml') # 文档字符串内容丢进去解析,第二个参数选择解析器
soup=BeautifulSoup(open('a.html'),'lxml') # 如果是一个文件,要open才能解析
print(soup.prettify()) # 美化文档

二、遍历文档树

遍历文档树:即直接通过标签名字选择,特点是选择速度快,但如果存在多个相同的标签则只返回第一个
1、用法
head=soup.head
print(head) 2、获取标签的名称
head=soup.head
print(head.name) 3、获取标签的属性(重点)
p=soup.p # 直接找p标签,跟p=soup.find('p')等价,速度慢一点
p=soup.body.p # 遍历是从根上找,速度更快
print(p.attrs) # attrs拿出标签所有属性以字典形式,如{'id':'my_p', 'class':['title]},其中class属性可能有多个,即便有一个也放到列表中 # 支持三种方式取出属性中class的值,取出来是个列表
print(p.attrs.get('class'))
print(p['class'])
print(p.get('class')) 4、获取标签的内容
p=soup.body.p
print(p.text) # text会取该标签以及它下的子孙标签的文本内容,拼到一起
print(p.content) # 获取标签的二进制内容
print(p.string) # p标签自己内部有文本,则取到,否则为None;这个文本不能是子孙标签里的文本
print(p.strings) # 怕p标签下的文本太多,把所有内容放到生成器里
print(list(p.strings)) # list遍历生成器,取出p标签下所有内容 5、嵌套选择(重点)
a=soup.body.a
print(a.get('id')) 6、子节点、子孙节点(不用)
print(soup.p.contents) # p下所有子节点(包含了文本内容)
print(soup.p.children) # 得到一个迭代器,包含p下所有子节点
print(list(soup.p.children)) # list遍历迭代器,取出p标签下所有子孙节点 7、父节点、祖先节点(不用)
print(soup.a.parent) # 获取a标签的父节点(只有一个)
print(soup.a.parents) # 得到一个生成器,包含a标签所有的祖先节点
print(list(soup.a.parents)) # list遍历,取出a标签所有最先节点 8、兄弟节点(不用)
print(soup.a.next_sibling) # 紧邻的下一个兄弟
print(soup.a.previous_sibling) # 紧邻的上一个兄弟
print(list(soup.a.next_siblings)) #下面的兄弟们=>生成器对象
print(list(soup.a.previous_siblings)) #上面的兄弟们=>生成器对象 # 重点:取标签名,取属性值,嵌套选择

三、搜索文档树(过滤)

1、两种主要搜索方式
find() # 只返回找到的第一个
find_all() # 返回找到的所有 find_all()的两个参数
# limit(限制查找的条数)
# 有name的标签,只要第一条,相当于find,唯一的区别是 find_all() 方法的返回结果是包含一个元素的列表,而 find() 方法直接返回结果
# find_all() 方法没有找到目标是返回空列表, find() 方法找不到目标时,返回 None
res=soup.find_all(name=True,limit=1)
print(res) # recursive(recursive默认True,递归查找,找子子孙孙),不用递归查找速度快点
res=soup.body.find_all(name='b',recursive=False) # 从body往下找,不递归,找不到b标签
res=soup.body.find_all(name='b',recursive=True) # 递归查找可以找到b标签
res=soup.body.find_all(name='p',recursive=False) # 从body往下找,不递归,可以找到p标
print(res)
2、五种过滤器:字符串、正则表达式、列表、True、方法

2.1、字符串过滤,,过滤条件name/id/attrs/text(文档内容),过滤内容是字符串
res=soup.find_all(text='The Dormouse's story') # 按文档内容找标签
res=soup.find(name='a') # 按标签名字查找
res=soup.find(id='my_p') # 按id查找
res=soup.find(class_='story') # 按属性查找,class属性关键字冲突,要用class_
res=soup.find(href='http://example.com/elsie') # 按属性查找
res=soup.find(attrs={'id':'my_p'}) # attrs是所有属性,按照属性的key:val查找
res=soup.find(attrs={'class':'story'})
print(res)
# 过滤条件是and关系,可以soup.find(name='a', id='my_p') 2.2、正则表达式,过滤条件name/id/attrs/text,过滤内容是正则表达式
import re
re_b=re.compile('^b') # 预编译正则表达式
res=soup.find(name=re_b) # 查找标签名字是b开头的,返回一个
res=soup.find_all(name=re_b) # 查找标签名字是b开头的所有标签
res=soup.find_all(id=re.compile('^l')) # 查找id是l开头的所有的标签
print(res) 2.3、列表,过滤条件name/id/attrs/text,过滤内容是列表,用来查找所有
res=soup.find_all(name=['body','b']) # 查找名字是body和b的标签
res=soup.find_all(class_=['sister','title']) # 查找class属性是'sister','title'的标签
print(res) 2.4、布尔,过滤条件name/id/attrs,过滤内容是Ture/False,用来查所有
res=soup.find_all(id=True) # 查找所有带id的标签
res=soup.find_all(id=False) # 查找所有不带id的标签
res=soup.find_all(href=True) # 查找所有有href属性的标签,就把链接全部拿到了
print(res) 2.5、方法(了解) 自定义过滤内容
# 定义一个方法传入tag,返回有class属性没有id的标签
def has_class_but_no_id(tag):
return tag.has_attr('class') and not tag.has_attr('id')
print(soup.find_all(has_class_but_no_id))
3、支持css选择器,不用find方法,而是用select方法;找出来的都放列表,即使一个也放列表
ret=soup.select('#my_p') # 查找id为my_p的标签
ret=soup.select('body p') # 查找body下的子子孙孙所有的p标签
ret=soup.select('body>p') # 只查找body下的儿子p标签,只到儿子节点
ret=soup.select('body>p')[0].text
ret=soup.select('body>p')[0].get_text() # 两种方式都可以取出文本内容
print(ret)

CSS选择器参考

四、修改文档树

不仅可以修改name、id、class,还可以往html页面插入标签,插入内容
应用:有些java软件配置文件是xml格式的,可以用bs4来操作修改 目前软件的配置文件,主要是一下几种
# ini: 用configparser模块操作
# conf
# xml: 用bs4模块操作
# yaml格式

五、总结

1、推荐使用lxml解析库
2、讲了三种选择器:标签选择器,find与find_all,css选择器
1、标签选择器筛选功能弱,但是速度快
2、建议使用find,find_all查询匹配单个结果或者多个结果
3、如果对css选择器非常熟悉建议使用select
3、记住常用的获取属性attrs和文本值get_text()的方法

解析库beautifulsoup的更多相关文章

  1. 爬虫----爬虫解析库Beautifulsoup模块

    一:介绍 Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会帮你 ...

  2. 爬虫解析库——BeautifulSoup

    解析库就是在爬虫时自己制定一个规则,帮助我们抓取想要的内容时用的.常用的解析库有re模块的正则.beautifulsoup.pyquery等等.正则完全可以帮我们匹配到我们想要住区的内容,但正则比较麻 ...

  3. 爬虫解析库BeautifulSoup的一些笔记

    BeautifulSoup类使用   基本元素 说明 Tag 标签,最基本的信息组织单元,分别是<>和</>标明开头和结尾 Name 标签的名字,<p></p ...

  4. 爬虫解析库beautifulsoup

    一.介绍 Beautiful Soup是一个可以从HTML或XML文件中提取数据的python库. #安装Beautiful Soup pip install beautifulsoup4 #安装解析 ...

  5. 解析库-beautifulsoup模块

    # -*- coding: utf-8 -*- from bs4 import BeautifulSoup # 安装:pip install beautifulsoup4 # Beautiful So ...

  6. 爬虫之解析库BeautifulSoup

    介绍 Beautiful Soup是python的一个库,最主要的功能是从网页抓取数据.官方解释如下: Beautiful Soup提供一些简单的.python式的函数用来处理导航.搜索.修改分析树等 ...

  7. BeautifulSoup解析库

    解析库 解析器 使用方法 优势 劣势 Python标准库 BeautifulSoup(html, 'html.parser') 速度适中,容错能力强 老版本python容错能力差 lxml HTML解 ...

  8. 爬虫 解析库re,Beautifulsoup,

    re模块 点我回顾 Beautifulsoup模块 #安装 Beautiful Soup pip install beautifulsoup4 #安装解析器 Beautiful Soup支持Pytho ...

  9. Python爬虫【解析库之beautifulsoup】

    解析库的安装 pip3 install beautifulsoup4 初始化 BeautifulSoup(str,"解析库") from bs4 import BeautifulS ...

随机推荐

  1. 4 zookeeper集群和基本命令

    4 zookeeper集群和基本命令 集群思路:先搞定一台服务器,再克隆出两台,形成集群! 1 安装zookeeper 我们的zookeeper是安装在/opt目录下 2 配置服务器编号 在/opt/ ...

  2. 微信小程序使用echarts/数据刷新重新渲染/图层遮挡问题

    1.微信小程序使用echarts,首先下载echarts并导入小程序项目中,因小程序后期上线对文件大小有要求,所以建议进行定制下载导入可减少文件大小占比,也可以下载以前旧版本文件比较小的应付使用 下载 ...

  3. WPF 实现用户头像选择器

    制作一个用户头像选择器仿 WeGame 制作一个用户头像选择Canvas为父控件所实现,展示图片使用Image,Path当作上方的蒙版; Canvas:主要用途方便移动Image,设置ClipToBo ...

  4. 基于SqlSugar的开发框架循序渐进介绍(13)-- 基于ElementPlus的上传组件进行封装,便于项目使用

    在我们实际项目开发过程中,往往需要根据实际情况,对组件进行封装,以更简便的在界面代码中使用,在实际的前端应用中,适当的组件封装,可以减少很多重复的界面代码,并且能够非常简便的使用,本篇随笔介绍基于El ...

  5. 排查jar包使用的第三方包并导出清单

    找到jar包 cd /data/xx/lib/xxx/ 解压缩 unzip xxx.jar -d tempjarfile 进入lib目录 cd tempjarfile/BOOT-INF/lib 生产j ...

  6. 牛客网 十二桥问题(状压DP)

    https://ac.nowcoder.com/acm/contest/1104/B 注意到\(\text{K}\)只有\(12\),因此对起点与每个毕经边对应的点单源最短路,\(\text{DP}\ ...

  7. 深入理解Spring注解机制(一):注解的搜索与处理机制

    前言 众所周知,spring 从 2.5 版本以后开始支持使用注解代替繁琐的 xml 配置,到了 springboot 更是全面拥抱了注解式配置.平时在使用的时候,点开一些常见的等注解,会发现往往在一 ...

  8. java学习第一天.day04

    顺序结构 代码里没有流程控制,程序是按照书写的格式从上而下一行一行执行的, 一条语句执行完之后继续执行下一条语句,中间没有判断和跳转,直到程序的结束. 选择结构 选择结构也被称为分支结构.代码根据逻辑 ...

  9. Mybatis简单入门--插入数据

    1. 开发环境 IDE:IDEA 构建工具:maven4.0.0 MySQL版本:8.0.11. 记得创建好数据库 Mybatis版本:3.5.7 MySQL不同版本的注意事项 驱动类driver-c ...

  10. 解决:Uncaught TypeError: $ is not a function

    本来好好的,突然就出现的错误,不过这并不是什么难解决的错误: 我的问题是:在js文件里我定义了一个var $;变量,只要把这个去掉就没问题了. 出现这种错误的解决方法: 1,先看看你的jq文件是否已经 ...