安迪Python

V1

2022/06/27阅读:13主题:默认主题

17 `bs对象.节点名h3.parent` parents 获取父节点 祖先节点

17 bs对象.节点名h3.parent parents 获取父节点 祖先节点

1. bs对象.节点名h3.parent 获取父节点

parent [ˈpeərənt]:父亲。

语法格式:bs对象.节点名h3.parent
返回值:节点对象

24_祖先节点
24_祖先节点
# 声明一个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>
25_祖先节点输出
25_祖先节点输出

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. 总结

26_提取祖先节点
26_提取祖先节点

4. 附html代码

<html>                                         <!--html节点是body节点的父节点,是h3节点的祖先节点-->
    <head>                                     <!--head节点和div节点平级,不是h3节点的祖先节点-->
        <meta charset="utf-8">
        <title>古诗2首</title>
    </head>
    <body>                                     <!--body节点是div节点的父节点,是h3节点的祖先节点-->
        <div class="poemsid="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>

网页示例图
27_网页示例图
27_网页示例图

分类:

后端

标签:

Python

作者介绍

安迪Python
V1