• Python爬虫是如何遍历文档树呢?一招教你


     

    遍历文档树

    1.直接子节点:.contents .children属性

    .content

    Tag的.content属性可以将Tag的子节点以列表的方式输出

    #!/usr/bin/python3
    # -*- coding:utf-8 -*-
     
    from bs4 import BeautifulSoup
     
    html = """
    <html><head><title>The Dormouse's story</title></head>
    <body>
    <p class="title" name="dromouse"><b>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>
    """另外要注意:光理论是不够的。这里顺便送大家一套2020最新python入门到高级项目实战视频教程,可以去小编的Python交流.裙 :七衣衣九七七巴而五(数字的谐音)转换下可以找到了,还可以跟老司机交流讨教!
     
    # 创建 Beautiful Soup 对象,指定lxml解析器
    soup = BeautifulSoup(html, "lxml")
     
    # 输出方式为列表
    print(soup.head.contents)
     
    print(soup.head.contents[0])

    运行结果

    [<title>The Dormouse's story</title>]
    <title>The Dormouse's story</title>

    .children

    它返回的不是一个列表,不过我们可以通过遍历获取所有的子节点。

    #!/usr/bin/python3
    # -*- coding:utf-8 -*-
     
    from bs4 import BeautifulSoup
     
    html = """
    <html><head><title>The Dormouse's story</title></head>
    <body>
    <p class="title" name="dromouse"><b>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>
    """
     
    # 创建 Beautiful Soup 对象,指定lxml解析器
    soup = BeautifulSoup(html, "lxml")
     
    # 输出方式为列表生成器对象
    print(soup.head.children)
     
    # 通过遍历获取所有子节点
    for child in soup.head.children:
        print(child)

    运行结果

    <list_iterator object at 0x008FF950>
    <title>The Dormouse's story</title>

    相关推荐:《Python相关教程》

    2.所有子孙节点:.descendants属性

    上面讲的.contents和.children属性仅包含Tag的直接子节点,.descendants属性可以对所有Tag的子孙节点进行递归循环,和children类似,我们也需要通过遍历的方式获取其中的内容。

    #!/usr/bin/python3
    # -*- coding:utf-8 -*-
     
    from bs4 import BeautifulSoup
     
    html = """
    <html><head><title>The Dormouse's story</title></head>
    <body>
    <p class="title" name="dromouse"><b>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>
    """
     
    # 创建 Beautiful Soup 对象,指定lxml解析器
    soup = BeautifulSoup(html, "lxml")
     
    # 输出方式为列表生成器对象
    print(soup.head.descendants)
     
    # 通过遍历获取所有子孙节点
    for child in soup.head.descendants:
        print(child)

    运行结果

    <generator object descendants at 0x00519AB0>
    <title>The Dormouse's story</title>
    The Dormouse's story

    3.节点内容:.string属性

    如果Tag只有一个NavigableString类型子节点,那么这个Tag可以使用.string得到子节点。如果一个Tag仅有一个子节点,那么这个Tab也可以使用.string方法,输出结果与当前唯一子节点的.string结果相同。

    通俗点来讲就是:如果一个标签里面没有标签了,那么.string就会返回标签里面的内容。如果标签里面只有唯一的一个标签了,那么.string也会返回里面的内容。例如:

    #!/usr/bin/python3
    # -*- coding:utf-8 -*-
     
    from bs4 import BeautifulSoup
     
    html = """
    <html><head><title>The Dormouse's story</title></head>
    <body>
    <p class="title" name="dromouse"><b>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>
    """
     
    # 创建 Beautiful Soup 对象,指定lxml解析器
    soup = BeautifulSoup(html, "lxml")
     
    print(soup.head.string)
     
    print(soup.head.title.string)

    运行结果

    The Dormouse's story
    The Dormouse's story

    都懂了吗?最后注意:光理论是不够的。这里顺便送大家一套2020最新python入门到高级项目实战视频教程,可以去小编的Python交流.裙 :七衣衣九七七巴而五(数字的谐音)转换下可以找到了,还可以跟老司机交流讨教!

    本文的文字及图片来源于网络加上自己的想法,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。

  • 相关阅读:
    梳理NLP预训练模型
    听懂NLPer说的是啥
    自然语言处理之HMM模型分词
    入门自然语言处理(NLP)的门
    js轮播图
    js中for循环this的使用
    vue-cli3的vue.config.js配置信息
    vuex的commit、payload、actions、setter、mutations等方法案例
    Vue做数据和视图原理(数据劫持)
    fetch的使用方法(基于promise方法进行增删改查)
  • 原文地址:https://www.cnblogs.com/chengxuyuanaa/p/12981078.html
Copyright © 2020-2023  润新知