当前位置:   article > 正文

Python BeautifulSoup4 入门使用_beautifulsoup4的功能

beautifulsoup4的功能

一、简介

  • BeautifulSoup4lxml 一样,是一个 html 解析器,主要功能也是解析和提取数据。

  • BeautifulSoup4爬虫 必学的技能。BeautifulSoup 最主要的功能是从网页抓取数据,Beautiful Soup 自动将输入文档转换为 Unicode 编码,输出文档转换为 utf-8 编码,不需要考虑编码方式,除非文档没有指定一个编码方式,这时,Beautiful Soup 就不能自动识别编码方式了,然后,仅仅需要说明一下原始编码方式就可以了。

  • BeautifulSoup 支持 Python 标准库中的 HTML 解析器,还 支持一些第三方的解析器,如果不安装它,则 Python 会使用 Python 默认的解析器。

  • 使用步骤

    # 1、安装
    $ pip install bs4
    
    # 2、导入
    from bs4 import BeautifulSoup
    
    # 3、创建对象
    soup = beautifulsoup(解析内容,解析器)
    
    # 服务器响应文件生成对象(注意编码格式)
    soup = BeautifulSoup(response.read().decode('utf-8'), 'lxml')
    # 本地文件生成对象(注意编码格式)
    soup = BeautifulSoup(open('test.html', 'r', encoding='utf-8'), 'lxml')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
  • 常用解析器:html.parserlxmlxmlhtml5lib,其中 lxml 解析器更强大,速度更快,推荐使用 lxml 解析器,附 beautifulsoup 菜鸟教程

    # 如果解释器不存在,则需要进行安装,其他解释器也一样
    $ pip install lxml
    
    • 1
    • 2

    请添加图片描述

二、案例

  • 列举一下比较常用的几个方法 find()、find_all()、select(),推荐使用 select() 支持选择器写法,还有一些属性的基本获取,更多的方法知道使用在查就行了,懒的列。

  • 本地测试数据

    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8"/>
      <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
      <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
      <title>Document</title>
    </head>
    <body>
      <div>
        <ul>
          <li id="l1" class="c1">北京</li>
          <li id="l2" class="c2">上海</li>
          <li id="l3">深圳</li>
          <li id="l4" title="dzm">武汉</li>
          <a href="" id="xlwb">新浪微博</a>
          <span>哈哈哈</span>
        </ul>
      </div>
      <ul>
        <li>大连</li>
        <li>沈阳</li>
        <li>长沙</li>
      </ul>
      <a href="" id="bdyx">百度一下</a>
    </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
  • 本地测试代码

    # 导入
    from bs4 import BeautifulSoup
    
    # 本地文件生成对象
    soup = BeautifulSoup(open('test.html', 'r', encoding='utf-8'), 'lxml')
    
    # 根据标签名查找节点 
    # 找到第一个符合条件的节点返回
    print(soup.a) # <a href="" id="xlwb">新浪微博</a>
    
    # 获取标签的属性和属性值
    print(soup.a.attrs) # {'href': '', 'id': 'xlwb'}
    
    
    
    
    
    # soup.find():返回单个对象
    
    
    # 根据 title 值来找到对应的标签对象
    print(soup.find('li', title="dzm")) # <li id="l4" title="dzm">武汉</li>
    
    # 根据 class 值来找到对应的标签对象
    # print(soup.find('li', class="c1")) # 关键字 class 存在 python 中会报错无法使用
    print(soup.find('li', class_="c1")) # 可以通过加下划线来使用属于系统关键字的属性 <li class="c1" id="l1">北京</li>
    
    
    
    
    
    # soup.find_all():返回数组
    
    
    # 查找所有 a 标签
    print(soup.find_all('a')) # [<a href="" id="xlwb">新浪微博</a>, <a href="" id="bdyx">百度一下</a>]
    
    # 查找所有 a | span 标签
    print(soup.find_all(['a', 'span'])) # [<a href="" id="xlwb">新浪微博</a>, <span>哈哈哈</span>, <a href="" id="bdyx">百度一下</a>]
    
    # limit 限制查找数量,查找前几个数据
    print(soup.find_all('li', limit=2)) # [<li class="c1" id="l1">北京</li>, <li class="c2" id="l2">上海</li>]
    
    
    
    
    
    #【推荐使用】soup.select():返回数组,制成选择器写法
    
    
    # 查找所有 a 标签
    print(soup.select('a')) # [<a href="" id="xlwb">新浪微博</a>, <a href="" id="bdyx">百度一下</a>]
    
    # 查找所有 a | span 标签
    print(soup.select('a,span')) # [<a href="" id="xlwb">新浪微博</a>, <span>哈哈哈</span>, <a href="" id="bdyx">百度一下</a>]
    
    # 【类选择器】
    # 查找 class 属性为 c2 的标签
    print(soup.select('.c2')) # [<li class="c2" id="l2">上海</li>]
    # 查找 id 属性为 l3 的标签
    print(soup.select('#l3')) # [<li id="l3">深圳</li>]
    
    # 【属性选择器】
    # 查找 li 标签中有 id 的标签
    print(soup.select('li[id]')) # [<li class="c1" id="l1">北京</li>, <li class="c2" id="l2">上海</li>, <li id="l3">深圳</li>, <li id="l4" title="dzm">武汉</li>]
    print(soup.select('li[id="l2"]')) # [<li class="c2" id="l2">上海</li>]
    print(soup.select('li[class="c5 c6"]')) # [<li class="c5 c6">沈阳</li>]
    
    # 【后代选择器】
    # 找到 div 下的 li
    print(soup.select('div li')) # [<li class="c1" id="l1">北京</li>, <li class="c2" id="l2">上海</li>, <li id="l3">深圳</li>, <li id="l4" title="dzm">武汉</li>]
    
    # 【子代选择器】
    # print(soup.select('div>ul>li')) # 这种格式的,空格写不写都行
    print(soup.select('div > ul > li')) # [<li class="c1" id="l1">北京</li>, <li class="c2" id="l2">上海</li>, <li id="l3">深圳</li>, <li id="l4" title="dzm">武汉</li>]
    
    
    
    
    
    
    # 【推荐使用】节点属性
    
    # 获取节点内容(注意:标签对象中只有内容,那么下面两个都行,如果标签对象中还包含其他标签,那么 string 就获取不到了)
    # 推荐使用 get_text()
    print(soup.select('span')[0].string) # 哈哈哈
    print(soup.select('span')[0].get_text()) # 哈哈哈
    
    # 获得节点
    obj = soup.select('#xlwb')[0] # <a href="" id="xlwb">新浪微博</a>
    # 标签名称
    print(obj.name) # a
    # 标签属性json
    print(obj.attrs) # {'href': '', 'id': 'xlwb'}
    # 获取属性值
    print(obj.attrs['id']) # xlwb
    print(obj.attrs.get('id')) # xlwb
    print(obj.get('id')) # xlwb
    print(obj['id']) # xlwb
    
    • 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
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/140349
推荐阅读
相关标签
  

闽ICP备14008679号