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


    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    【终端输出】

    步骤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'> 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    【终端输出】

    步骤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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    在这里插入图片描述

    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    【终端输出】

    步骤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>
    )]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    运行代码后,得到一个列表。
    列表最前面的数字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>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    网页示例图

    在这里插入图片描述

  • 相关阅读:
    【JavaEE】Cookie和Session详解
    P2181 对角线
    CSS滚动条详解(::-webkit-scrollbar )
    关于Unity中的transform.InverseTransformPoint, transform.InverseTransofrmDirection
    手写线程池,能进行任务窃取的线程池---注释
    大数据之ZooKeeper(一)
    大厂面试题Object object = new Object()
    Redis中的慢查询日志(一)
    Windows 10 安装配置WSL2(Ubuntu 20.04)教程
    C# OpenCvSharp Yolov8 Detect 目标检测
  • 原文地址:https://blog.csdn.net/weixin_63986098/article/details/125493934