首页 > 其他分享 >bs4的使用 遍历文档树

bs4的使用 遍历文档树

时间:2024-04-07 17:46:06浏览次数:16  
标签:body 遍历 bs4 res 节点 soup 文档 print find

 

bs4的使用

# 遍历文档树
# 搜索文档树(5种过滤规则)
# limit和recursive参数

import requests
# pip3 install beautifulsoup4  解析html和xml,修改html和xml
from bs4 import BeautifulSoup

# res=requests.get('https://www.autohome.com.cn/news/1/#liststart')
#
# with open('a.html','w') as f:
#     f.write(res.text)

from bs4 import BeautifulSoup
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>
"""
# 文档容错能力,不是一个标准的html也能解析
soup=BeautifulSoup(html_doc,'lxml')

# print(soup.prettify())

 

 

遍历文档树
#遍历文档树:即直接通过标签名字选择,特点是选择速度快,但如果存在多个相同的标签则只返回第一个
#1、用法

# head=soup.head
# print(head)

 

#2、获取标签的名称

# head=soup.head
# print(head.name)

 

#3、获取标签的属性*****

# p=soup.body.p
# # class可能有多个,即便有一个也放到列表中
# # print(p.attrs)
# print(p.attrs.get('class'))
# print(p['class'])
# print(p.get('class'))

 

 

#4、获取标签的内容

# p=soup.body.p
# # text会取该标签,子子孙孙的内容,拼到一起
# print(p.text)
# print(p.string)# # p下的文本只有一个时,取到,否则为None
# print(p.strings)#  生成器
# print(list(p.strings))  # #拿到一个生成器对象, 取到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)) #得到一个迭代器,包含p下所有子节点

 

#7、父节点、祖先节点

# print(soup.a.parent) #获取a标签的父节点(只有一个)
# print(soup.p.parent) #获取p标签的父节点
# print(soup.a.parents) #找到a标签所有的祖先节点,父亲的父亲,父亲的父亲的父亲...
# print(list(soup.a.parents))#找到a标签所有的祖先节点,父亲的父亲,父亲的父亲的父亲...
# print(len(list(soup.a.parents)))#找到a标签所有的祖先节点,父亲的父亲,父亲的父亲的父亲...

 

 

#8、兄弟节点

# print(soup.a.next_sibling) #下一个兄弟
# print(soup.a.previous_sibling) #上一个兄弟
#
# print(list(soup.a.next_siblings)) #下面的兄弟们=>生成器对象
# print(list(soup.a.previous_siblings)) #上面的兄弟们=>生成器对象

# 重点:取标签名,取属性值,嵌套选择

 

 

 

搜索文档树
# find() # 只返回找到的第一个
# find_all() # 找到的所有
# 五种过滤器: 字符串、正则表达式、列表、True、方法

# 字符串过滤,过滤内容是字符串
# a=soup.find(name='a')
# res=soup.find(id='my_p')
# res=soup.find(class_='story')
# res=soup.find(href='http://example.com/elsie')

# res=soup.find(attrs={'id':'my_p'})
# res=soup.find(attrs={'class':'story'})
# print(res)

# 正则表达式
# import re
# # re_b=re.compile('^b')
# res=soup.find(name=re_b)
# # res=soup.find_all(name=re_b)
# res=soup.find_all(id=re.compile('^l'))
# print(res)

# 列表

# res=soup.find_all(name=['body','b'])
# res=soup.find_all(class_=['sister','title'])
# print(res)

# True和false

# res=soup.find_all(name=True)
# res=soup.find_all(id=True)
# res=soup.find_all(id=False)
# res=soup.find_all(href=True)
# print(res)

 

 

 

# 方法(了解)
# 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))


#limit(限制查找的条数)
# res=soup.find_all(name=True,limit=1)
# print(res)
# recursive(recursive递归查找,找子子孙孙)
# res=soup.body.find_all(name='b ',recursive=False)
# res=soup.body.find_all(name='p',recursive=False)
# res=soup.body.find_all(name='b',recursive=True)
# print(res)

# css选择
# ret=soup.select('#my_p')
# https://www.w3school.com.cn/cssref/css_selectors.asp
# ret=soup.select('body p') # 子子孙孙
# ret=soup.select('body>p') # 直接子节点(儿子)
# ret=soup.select('body>p')[0].text # 直接子节点(儿子)
# # ret=soup.select('body>p')[0].a.find()
# print(ret)

 

# bs4的修改文档树 软件配置文件是xml格式的

# 软件的配置文件
# ini:configparser
# conf
# xml:bs4
# yaml格式
了解

 

标签:body,遍历,bs4,res,节点,soup,文档,print,find
From: https://www.cnblogs.com/97zs/p/18119533

相关文章

  • 永不生锈的螺丝钉!一款简洁好用的数据库表结构文档生成器
    大家好,我是Java陈序员。在企业级开发中,我们经常会有编写数据库表结构文档的需求,常常需要手写维护文档,很是繁琐。今天,给大家介绍一款数据库表结构文档生成工具。关注微信公众号:【Java陈序员】,获取开源项目分享、AI副业分享、超200本经典计算机电子书籍等。项目介绍screw......
  • 图的遍历试题解析
    一、单项选择题01.下列关于广度优先算法的说法中,正确的是(A ).Ⅰ.当各边的权值相等时,广度优先算法可以解决单源最短路径问题Ⅱ.当各边的权值不等时,广度优先算法可用来解决单源最短路径问题Ⅲ.广度优先遍历算法类似于树中的后序遍历算法Ⅳ.实现图的广度优先算法时,使用的......
  • 基于SpringBoot的“垃圾分类网站”的设计与实现(源码+数据库+文档+PPT)
    基于SpringBoot的“垃圾分类网站”的设计与实现(源码+数据库+文档+PPT)开发语言:Java数据库:MySQL技术:SpringBoot工具:IDEA/Ecilpse、Navicat、Maven系统展示系统功能结构图系统功能界面图用户登录、用户注册界面图4垃圾图谱界面图管理员登录界面图用户......
  • 基于SpringBoot的“汽车租赁系统”的设计与实现(源码+数据库+文档+PPT)
    基于SpringBoot的“汽车租赁系统”的设计与实现(源码+数据库+文档+PPT)开发语言:Java数据库:MySQL技术:SpringBoot工具:IDEA/Ecilpse、Navicat、Maven系统展示系统功能结构图管理员登录界面图管理员功能界面图用户管理界面图车辆品牌管理界面图车辆颜色管......
  • 【办公类-48-02】20240407每月电子屏台账汇总成docx-2(腾讯文档xlsx导入docx,每页20条)
    作品展示背景需求:安全主任再次催交台账一分园老师发的是链接版——这是我原来制作的在线共享填写“腾讯文档”。但是感觉手机竖版填写起来不方便,(表格是横版的,要向右滑动点击格子,填起来容易错行),所以我推荐使用问卷星填写了。腾讯文档里面是选择按钮填入信息,也是所有数据......
  • 18天【代码随想录算法训练营34期】● 513.找树左下角的值 ● 112. 路径总和 113.路径
    513.找树左下角的值#Definitionforabinarytreenode.#classTreeNode:#def__init__(self,val=0,left=None,right=None):#self.val=val#self.left=left#self.right=rightclassSolution:deffindBottomLeftValue(self......
  • swagger文档枚举类型描述
    背景:问题:使用swagger作为api文档,但文档中的枚举类型仅显示枚举name,对于使用文档的人员来讲不容易理解解决思路:枚举类型加上自定义的描述解决方案maven配置<dependency><groupId>io.swagger.core.v3</groupId><artifactId>swagger-models-j......
  • 二叉树-迭代遍历
    递归的实现是每次递归调用都把函数的局部变量、参数值和返回地址等压入调用栈中,然后递归返回的时候就从栈顶弹出上一次递归的各项参数。可利用栈实现二叉树的前中后序遍历。前序遍历前序遍历是中左右的顺序,整体过程就是逐次访问父节点,压入右孩子再压入左孩子,由于访问的节点和待......
  • 在线视频教育平台|基于Springboot的在线视频教育平台系统设计与实现(源码+数据库+文档
    在线视频教育平台目录基于Springboot的在线视频教育平台系统设计与实现一、前言二、系统设计三、系统功能设计 1、前台:2、后台用户功能模块教师功能模块四、数据库设计 五、核心代码 六、论文参考七、最新计算机毕设选题推荐八、源码获取:博主介绍:✌️大......
  • 使用POI填充Word文档,一些注意事项以及解决办法
    有这样一个需求:需要将用户输入的数据填写到准备好的Word模版中并提供下载,最终选择POI-tl和POI来完成上述需求。在这个过程中,主要遇到了以下两个问题:1.Word的两个格式doc和docx(两种文件的区别大家可以自行百度了解下),POI并没有提供统一的处理类。分别用HWPFDocument处理doc......