17 bs对象.节点名h3.parent
parents 获取父节点 祖先节点
文章目录
1. bs对象.节点名h3.parent
获取父节点
parent [ˈpeərənt]:父亲。
语法格式:bs对象.节点名h3.parent
返回值:节点对象
# 声明一个html_str字符串变量,存储部分HTML代码
html_str = """
<html>
<head><meta charset="utf-8"><title>古诗2首</title></head>
<body>
<div class="poems" id="section1"><h2>如梦令</h2><h3>李清照<span>(宋)</span></h3><p>试问卷帘人</p><p>却道海棠依旧</p><p>知否?知否?</p><p>应是绿肥红瘦</p></div>
<div class="poems" id="section2"><h2>无题</h2><h3>佚名</h3>
<p>本是青灯不归客</p><p>却因浊酒留风尘</p><p>终是庄周梦了蝶</p><p>你是恩赐也是劫</p>
</div>
</body>
</html>
"""
# 1. 从bs4解析库导入BeautifulSoup类用于解析数据
from bs4 import BeautifulSoup
# 2.1 BeautifulSoup类(要解析的字符串,解析器)
# 2.2 传入要解析的字符串html_str和解析器lxml,实例化类得到一个BeautifulSoup对象
bs_duixiang = BeautifulSoup(html_str, 'lxml')
print("步骤1:bs对象.节点名h3——取到第1个h3节点:")
print(bs_duixiang.h3,'\n')
print("步骤2.1:bs对象.节点名h3.parent——取到第h3节点的父节点div节点:")
print(bs_duixiang.h3.parent,'\n')
print("步骤2.2 查看得到节点的数据类型:")
print(type(bs_duixiang.h3.parent),'\n')
【终端输出】
步骤1:bs对象.节点名h3——取到第1个h3节点:
<h3>李清照<span>(宋)</span></h3>
步骤2.1:bs对象.节点名h3.parent——取到第h3节点的父节点div节点:
<div class="poems" id="section1"><h2>如梦令</h2><h3>李清照<span>(宋)</span></h3><p>试问卷帘人</p><p>却道海棠依旧</p><p>知否?知否?</p><p>应是绿肥红瘦</p></div>
步骤2.2 查看得到节点的数据类型:
<class 'bs4.element.Tag'>
2. bs对象.节点名h3.parents
获取祖先节点
enumerate [ɪˈnjuːməreɪt]:罗列,在Python中加入enumerate可以输出元素索引。
语法格式:bs对象.节点名.parents
返回值:生成器
取值方法:
方法1:for循环从生成器中取值for i,child in enumerate(bs_duixiang.h3.parents)
方法2:用list函数从生成器中取值list(enumerate(bs_duixiang.h3.parents))
2.1 for循环从生成器中取值
# 声明一个html_str字符串变量,存储部分HTML代码
html_str = """
<html>
<head><meta charset="utf-8"><title>古诗2首</title></head>
<body>
<div class="poems" id="section1"><h2>如梦令</h2><h3>李清照<span>(宋)</span></h3><p>试问卷帘人</p><p>却道海棠依旧</p><p>知否?知否?</p><p>应是绿肥红瘦</p></div>
<div class="poems" id="section2"><h2>无题</h2><h3>佚名</h3>
<p>本是青灯不归客</p><p>却因浊酒留风尘</p><p>终是庄周梦了蝶</p><p>你是恩赐也是劫</p>
</div>
</body>
</html>
"""
# 1. 从bs4解析库导入BeautifulSoup类用于解析数据
from bs4 import BeautifulSoup
# 2.1 BeautifulSoup类(要解析的字符串,解析器)
# 2.2 传入要解析的字符串html_str和解析器lxml,实例化类得到一个BeautifulSoup对象
bs_duixiang = BeautifulSoup(html_str, 'lxml')
print("步骤1:bs对象.节点名h3——取到第1个h3节点:")
print(bs_duixiang.h3,'\n')
print("步骤2.1:bs对象.节点名h3.parents——取到第h3节点的祖先节点:")
print(bs_duixiang.h3.parents,'\n')
print("步骤2.2 查看得到节点的数据类型:")
print(type(bs_duixiang.h3.parents),'\n')
print("步骤3:for循环从生成器中取值:")
for i,child in enumerate(bs_duixiang.h3.parents) :
print(i, child)
【终端输出】
步骤1:bs对象.节点名h3——取到第1个h3节点:
<h3>李清照<span>(宋)</span></h3>
步骤2.1:bs对象.节点名h3.parents——取到第h3节点的祖先节点:
<generator object PageElement.parents at 0x0000017B0D5144A0>
步骤2.2 查看得到节点的数据类型:
<class 'generator'>
步骤3:for循环从生成器中取值:
0 <div class="poems" id="section1"><h2>如梦令</h2><h3>李清照<span>(宋)</span></h3><p>试问卷帘人</p><p>却道海棠依旧</p><p>知否?知否?</p><p>应是绿肥红瘦</p></div>
1 <body>
<div class="poems" id="section1"><h2>如梦令</h2><h3>李清照<span>(宋)</span></h3><p>试问卷帘人</p><p>却道海棠依旧</p><p>知否?知否?</p><p>应是绿肥红瘦</p></div>
<div class="poems" id="section2"><h2>无题</h2><h3>佚名</h3>
<p>本是青灯不归客</p><p>却因浊酒留风尘</p><p>终是庄周梦了蝶</p><p>你是恩赐也是劫</p>
</div>
</body>
2 <html>
<head><meta charset="utf-8"/><title>古诗2首</title></head>
<body>
<div class="poems" id="section1"><h2>如梦令</h2><h3>李清照<span>(宋)</span></h3><p>试问卷帘人</p><p>却道海棠依旧</p><p>知否?知否?</p><p>应是绿肥红瘦</p></div>
<div class="poems" id="section2"><h2>无题</h2><h3>佚名</h3>
<p>本是青灯不归客</p><p>却因浊酒留风尘</p><p>终是庄周梦了蝶</p><p>你是恩赐也是劫</p>
</div>
</body>
</html>
3 <html>
<head><meta charset="utf-8"/><title>古诗2首</title></head>
<body>
<div class="poems" id="section1"><h2>如梦令</h2><h3>李清照<span>(宋)</span></h3><p>试问卷帘人</p><p>却道海棠依旧</p><p>知否?知否?</p><p>应是绿肥红瘦</p></div>
<div class="poems" id="section2"><h2>无题</h2><h3>佚名</h3>
<p>本是青灯不归客</p><p>却因浊酒留风尘</p><p>终是庄周梦了蝶</p><p>你是恩赐也是劫</p>
</div>
</body>
</html>
2.2 用list函数从生成器中取值
# 声明一个html_str字符串变量,存储部分HTML代码
html_str = """
<html>
<head><meta charset="utf-8"><title>古诗2首</title></head>
<body>
<div class="poems" id="section1"><h2>如梦令</h2><h3>李清照<span>(宋)</span></h3><p>试问卷帘人</p><p>却道海棠依旧</p><p>知否?知否?</p><p>应是绿肥红瘦</p></div>
<div class="poems" id="section2"><h2>无题</h2><h3>佚名</h3>
<p>本是青灯不归客</p><p>却因浊酒留风尘</p><p>终是庄周梦了蝶</p><p>你是恩赐也是劫</p>
</div>
</body>
</html>
"""
# 1. 从bs4解析库导入BeautifulSoup类用于解析数据
from bs4 import BeautifulSoup
# 2.1 BeautifulSoup类(要解析的字符串,解析器)
# 2.2 传入要解析的字符串html_str和解析器lxml,实例化类得到一个BeautifulSoup对象
bs_duixiang = BeautifulSoup(html_str, 'lxml')
print("步骤1:bs对象.节点名h3——取到第1个h3节点:")
print(bs_duixiang.h3,'\n')
print("步骤2.1:bs对象.节点名h3.parents——取到第h3节点的祖先节点:")
print(bs_duixiang.h3.parents,'\n')
print("步骤2.2 查看得到节点的数据类型:")
print(type(bs_duixiang.h3.parents),'\n')
print("步骤3:用list函数从生成器中取值:")
print(list(enumerate(bs_duixiang.h3.parents)))
【终端输出】
步骤1:bs对象.节点名h3——取到第1个h3节点:
<h3>李清照<span>(宋)</span></h3>
步骤2.1:bs对象.节点名h3.parents——取到第h3节点的祖先节点:
<generator object PageElement.parents at 0x0000017B0D514580>
步骤2.2 查看得到节点的数据类型:
<class 'generator'>
步骤3:用list函数从生成器中取值:
[(0, <div class="poems" id="section1"><h2>如梦令</h2><h3>李清照<span>(宋)</span></h3><p>试问卷帘人</p><p>却道海棠依旧</p><p>知否?知否?</p><p>应是绿肥红瘦</p></div>), (1, <body>
<div class="poems" id="section1"><h2>如梦令</h2><h3>李清照<span>(宋)</span></h3><p>试问卷帘人</p><p>却道海棠依旧</p><p>知否?知否?</p><p>应是绿肥红瘦</p></div>
<div class="poems" id="section2"><h2>无题</h2><h3>佚名</h3>
<p>本是青灯不归客</p><p>却因浊酒留风尘</p><p>终是庄周梦了蝶</p><p>你是恩赐也是劫</p>
</div>
</body>), (2, <html>
<head><meta charset="utf-8"/><title>古诗2首</title></head>
<body>
<div class="poems" id="section1"><h2>如梦令</h2><h3>李清照<span>(宋)</span></h3><p>试问卷帘人</p><p>却道海棠依旧</p><p>知否?知否?</p><p>应是绿肥红瘦</p></div>
<div class="poems" id="section2"><h2>无题</h2><h3>佚名</h3>
<p>本是青灯不归客</p><p>却因浊酒留风尘</p><p>终是庄周梦了蝶</p><p>你是恩赐也是劫</p>
</div>
</body>
</html>), (3, <html>
<head><meta charset="utf-8"/><title>古诗2首</title></head>
<body>
<div class="poems" id="section1"><h2>如梦令</h2><h3>李清照<span>(宋)</span></h3><p>试问卷帘人</p><p>却道海棠依旧</p><p>知否?知否?</p><p>应是绿肥红瘦</p></div>
<div class="poems" id="section2"><h2>无题</h2><h3>佚名</h3>
<p>本是青灯不归客</p><p>却因浊酒留风尘</p><p>终是庄周梦了蝶</p><p>你是恩赐也是劫</p>
</div>
</body>
</html>
)]
运行代码后,得到一个列表。
列表最前面的数字0
,1
,2
,3
是元素的索引。
第1个元素是h3
节点的父节点div
节点。
第2个元素是div
节点的父body
节点。
第3个元素是body
节点的父节点html
节点。
第4个元素是所有节点。
for循环和list函数最终的输出内容是一样的,只是list函数输出的是列表形式。
3. 总结
4. 附html代码
<html> <!--html节点是body节点的父节点,是h3节点的祖先节点-->
<head> <!--head节点和div节点平级,不是h3节点的祖先节点-->
<meta charset="utf-8">
<title>古诗2首</title>
</head>
<body> <!--body节点是div节点的父节点,是h3节点的祖先节点-->
<div class="poems" id="section1"> <!--div节点是h3节点的父节点-->
<h2>如梦令</h2>
<h3>李清照<span>(宋)</span></h3> <!--以h3节点为基准-->
<p>试问卷帘人</p>
<p>却道海棠依旧</p>
<p>知否?知否?</p>
<p>应是绿肥红瘦</p>
</div>
<div class="poems" id="section2">
<h2>无题</h2>
<h3>佚名</h3>
<p>本是青灯不归客</p>
<p>却因浊酒留风尘</p>
<p>终是庄周梦了蝶</p>
<p>你是恩赐也是劫</p>
</div>
</body>
</html>