• Python 解析器BeautifulSoup4



    活动地址:CSDN21天学习挑战赛

    一、安装BeautifulSoup4

    BeautifulSoup4是爬虫必学,BeautifulSoup功能是从网页抓取数据,BeautifulSoup自动将输入文档转换为Unicode编码,输出文档转换为utf8。BeautifulSoup支持Python标准库中的HTML解析器,还支持一些第三方的解析器。

    1、BeautifulSoup4简介

    BeautifulSoup4是一个HTML/XML的解析器,主要功能是如何解析和提取 HTML/XML 数据。

    2、安装BeautifulSoup

    pip install beautifulsoup4
    
    • 1

    在这里插入图片描述

    3、四种解析器的优缺点

    解析器使用方法优势劣势
    Python标准库BeautifulSoup(markup,“html.parser”) 1)Python的内置标准库
    2)执行速度适中
    3)文档容错能力强
    Python 2.7.3 or 3.2.2)前的
    版本中文档容错能力差
    html5libBeautifulSoup(markup,“html5lib”) 1)最好的容错性
    2)以浏览器的方式解析文档
    3)生成HTML5格式的文档
    1)速度慢
    2)不依赖外部扩展
    lxml HTML 解析器BeautifulSoup(markup,“lxml”) 1)速度快
    2)文档容错能力强
    需要安装C语言库
    lxml XML 解析器 BeautifulSoup(markup,[“lxml-xml”]) 1)速度快
    2)唯一支持XML的解析器
    需要安装C语言库

    ​## 4、实例演示
    在这里插入图片描述

    from bs4 import BeautifulSoup
    html = """
    

    HelloWorld

    • Flink
    • Spark
    • Hadoop
    • Kafka
    """
    # 创建对象 soup = BeautifulSoup(html, 'lxml') # 格式化输出 print(soup.prettify()) # 获取div标签的所有内容 print(soup.div) # 获取标签的名字 print(soup.div.name) # 获取标签class值 print(soup.div["class"]) # 获取标签文本内容 print(soup.li.string) # 获取li所有标签 print(soup.findAll("li")) # 获取id="list1"所有值 print(soup.find(id="list1")) # 遍历li标签,打印所有class的值 for item in soup.findAll("li"): print(item.get_text("class")) # 遍历a标签,打印href的值 for item in soup.findAll("a"): print(item.get("href"))
    • 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
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    结果:

    D:\python383\python.exe D:/pythonproject/csdn/RequestsDemo.py
    <html>
     <body>
      <div class="panel">
       <div class="heading">
        <h1>
         HelloWorld
        </h1>
       </div>
       <div class="body">
        <ul class="list" id="list1" name="element">
         <li class="element">
          Flink
         </li>
         <li class="element">
          Spark
         </li>
         <li class="element">
          Hadoop
         </li>
         <li class="element">
          Kafka
         </li>
        </ul>
        <ul class="list-small" id="list2">
         <li class="element">
          Flink
         </li>
         <a href="https://tianlingqun.blog.csdn.net/">
          我的博客
         </a>
         <li class="element">
          Hadoop
         </li>
        </ul>
       </div>
      </div>
     </body>
    </html>
    ======================================== 分隔符 ========================================
    <div class="panel">
    <div class="heading">
    <h1>HelloWorld</h1>
    </div>
    <div class="body">
    <ul class="list" id="list1" name="element">
    <li class="element">Flink</li>
    <li class="element">Spark</li>
    <li class="element">Hadoop</li>
    <li class="element">Kafka</li>
    </ul>
    <ul class="list-small" id="list2">
    <li class="element">Flink</li>
    <a href="https://tianlingqun.blog.csdn.net/">我的博客</a>
    <li class="element">Hadoop</li>
    </ul>
    </div>
    </div>
    ======================================== 分隔符 ========================================
    div
    ======================================== 分隔符 ========================================
    ['panel']
    ======================================== 分隔符 ========================================
    Flink
    ======================================== 分隔符 ========================================
    [<li class="element">Flink</li>, <li class="element">Spark</li>, <li class="element">Hadoop</li>, <li class="element">Kafka</li>, <li class="element">Flink</li>, <li class="element">Hadoop</li>]
    ======================================== 分隔符 ========================================
    <ul class="list" id="list1" name="element">
    <li class="element">Flink</li>
    <li class="element">Spark</li>
    <li class="element">Hadoop</li>
    <li class="element">Kafka</li>
    </ul>
    ======================================== 分隔符 ========================================
    Flink
    Spark
    Hadoop
    Kafka
    Flink
    Hadoop
    ======================================== 分隔符 ========================================
    https://tianlingqun.blog.csdn.net/
    
    Process finished with exit code 0
    
    
    • 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
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85

    4、四种常见对象

    1)Tag:

    注意:查找方式是所有内容中的第一个符合要求的标签

    Tag通俗点讲就是HTML中的一个个标签。
    在这里插入图片描述

    soup = BeautifulSoup('
      Flink
    '
    , 'lxml') tag = soup.ul print(tag) print(type(tag))
    • 1
    • 2
    • 3
    • 4

    2)NavigableString:

    如果拿到标签后,还想获取标签中的内容。那么可以通过tag.string获取标签中的文字

    在这里插入图片描述

    from bs4 import BeautifulSoup
    soup = BeautifulSoup('
      Flink
    '
    , 'lxml') tag = soup.ul # 直接获取标签内的文字 print(soup.ul.string)
    • 1
    • 2
    • 3
    • 4
    • 5

    3)BeautifulSoup:

    BeautifulSoup对象表示的是一个文档的全部内容,大部分时间可以把它当做Tag对象,它支持遍历文档树和搜索文档树中描述的大部分方法

    在这里插入图片描述

    from bs4 import BeautifulSoup
    soup = BeautifulSoup('
      Flink
    '
    , 'lxml') # 获取类型 print(type(soup.name)) # 获取属性 文档本身属性为null print(soup.attrs) # 获取名称 print(soup.name)
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    4)Comment:

    Tag,NavigableString,BeautifulSoup几乎覆盖了html和xml中的所有内容,但是还有一些特殊对象,容易让人担心的内容是文档的注释部分Comment对象是一个特殊类型的NavigableString对象
    在这里插入图片描述

    from bs4 import BeautifulSoup
    soup = BeautifulSoup('
      Flink
    '
    , 'lxml') print(soup.ul) print(soup.ul.string) print(type(soup.ul.string))
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    二、CSS选择器

    BS4 支持大部分的 CSS 选择器,比如常见的标签选择器、类选择器、id 选择器,以及层级选择器。Beautiful Soup 提供了一个 select() 方法,通过向该方法中添加选择器,就可以在 HTML 文档中搜索到与之对应的内容

    1、实战

    在这里插入图片描述

    from bs4 import BeautifulSoup
    
    html = """
    Python教学
    

    HelloWorld

    • Flink
    • Spark
    • Hadoop
    • Kafka
    """
    # 创建对象 soup = BeautifulSoup(html, 'lxml') # 根据li标签查找 print(soup.select("li")) # 根据类名查找 print(soup.select(".list")) # 根据id查找 print(soup.select("#list2")) # 根据属性选择器查找 print(soup.select("a[href]")) # 后代节点查找 print(soup.select('html head title')) # 标签+类或id组合形式 id位list2 标签为ul print(soup.select("ul#list2")) # 标签+类或id组合形式 class为list-small 标签为ul print(soup.select("ul.list-small")) # 查找兄弟节点 print(soup.select('li + a')) # 查找子节点 2种结果一样 print(soup.select('ul a')) print(soup.select('ul > a')) # 查找孙子节点 2种结果一样 print(soup.select('.list-small #link')) print(soup.select('.list-small > #link'))
    • 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
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    结果:

    D:\python383\python.exe D:/pythonproject/csdn/RequestsDemo.py
    [<li class="element">Flink</li>, <li class="element">Spark</li>, <li class="element">Hadoop</li>, <li class="element">Kafka</li>, <li class="element">Flink</li>, <li class="element">Hadoop</li>]
    ========================================	分割线	========================================
    [<ul class="list" id="list1" name="element">
    <li class="element">Flink</li>
    <li class="element">Spark</li>
    <li class="element">Hadoop</li>
    <li class="element">Kafka</li>
    </ul>]
    ========================================	分割线	========================================
    [<ul class="list-small" id="list2">
    <li class="element">Flink</li>
    <a href="https://tianlingqun.blog.csdn.net/" id="link">我的博客</a>
    <li class="element">Hadoop</li>
    </ul>]
    ========================================	分割线	========================================
    [<a href="https://tianlingqun.blog.csdn.net/" id="link">我的博客</a>]
    ========================================	分割线	========================================
    [<title>Python教学</title>]
    ========================================	分割线	========================================
    [<ul class="list-small" id="list2">
    <li class="element">Flink</li>
    <a href="https://tianlingqun.blog.csdn.net/" id="link">我的博客</a>
    <li class="element">Hadoop</li>
    </ul>]
    ========================================	分割线	========================================
    [<ul class="list-small" id="list2">
    <li class="element">Flink</li>
    <a href="https://tianlingqun.blog.csdn.net/" id="link">我的博客</a>
    <li class="element">Hadoop</li>
    </ul>]
    ========================================	分割线	========================================
    [<a href="https://tianlingqun.blog.csdn.net/" id="link">我的博客</a>]
    ========================================	分割线	========================================
    [<a href="https://tianlingqun.blog.csdn.net/" id="link">我的博客</a>]
    ========================================
    [<a href="https://tianlingqun.blog.csdn.net/" id="link">我的博客</a>]
    ========================================	分割线	========================================
    [<a href="https://tianlingqun.blog.csdn.net/" id="link">我的博客</a>]
    ========================================
    [<a href="https://tianlingqun.blog.csdn.net/" id="link">我的博客</a>]
    
    Process finished with exit code 0
    
    
    • 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
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
  • 相关阅读:
    极智嘉(Geek+)官宣重磅合作伙伴,再度赋能仓储自动化解决方案落地
    回归测试选择用例,看这里就可以了。
    Echarts绘制任意数据的正态分布图
    【爬虫】data: image/png; base64图片数据
    专访科杰科技CEO于洋:湖仓一体数据底座,企业构建数据能力的“最优解” | 爱分析访谈
    YOLO目标检测——人脸口罩佩戴数据集【(含对应voc、coco和yolo三种格式标签】
    产品待办列表PBL与产品需求文档PRD的本质区别
    以数智化驱动为核心,构建研发效能增长动力
    ATE新能源汽车充电桩自动负载测试系统
    2093197-94-3,DBCO-BODIPY FL,二苯并环辛炔-BODIPY FL点击化学染料环辛炔
  • 原文地址:https://blog.csdn.net/walykyy/article/details/126441349