Python3网络爬虫教程14——BeautifulSoup4之搜索文档树

版权声明:本文章为沐言-BigTree原创,转载复制请标明出处 https://blog.csdn.net/u011318077/article/details/86633433

上接:
Python3网络爬虫教程13——BeautifulSoup4基本使用及遍历文档树
https://blog.csdn.net/u011318077/article/details/86633392

5.3. 搜索文档树

5.3.1. 过滤器

  • find_all()

  • find_all() 方法将返回文档中符合条件的所有tag

  • 过滤器

    • 过滤器可以被用在tag的name中,节点的属性中,字符串中或他们的混合中

    • 传入字符串

      • soup.find_all(‘b’)
    • 传入正则表达式

      • 找出所有以b开头的标签
      • soup.find_all(re.compile(r"^b"))
      • 找出所有名字中包含”t”的标签
      • soup.find_all(re.compile(r"t"))
    • 参考实例67_18

    • 传入列表参数,

    • Beautiful Soup会将与列表中任一元素匹配的内容返回.

    • 返回值也是一个列表

    • soup.find_all([“a”, “b”])

    • 传入True,True 可以匹配任何值,

    • 下面代码查找到所有的tag,但是不会返回字符串节点

    • oup.find_all(True)

    • 参考实例67_19

  • 方法

    • 没有合适的过滤器,可以定义一个方法
    • 方法只接受一个元素参数,如果这个方法返回 True
    • 表示当前元素匹配并且被找到,如果不是则反回 False
    • 参考实例67_20

5.3.2. find_all()的参数使用

  • find_all()的参数使用
  • find_all( name , attrs , recursive , string , **kwargs )
    • name 参数

    • 可以查找所有名字为 name 的tag,字符串对象会被自动忽略掉

    • keyword 参数

    • 如果一个指定名字的参数不是搜索内置的参数名,

    • 搜索时会把该参数当作指定名字tag的属性来搜索,如果包含一个名字为 id 的参数,

    • Beautiful Soup会搜索每个tag的”id”属性

    • 有些tag属性在搜索不能使用,比如HTML5中的 data-* 属性

    • 但是可以通过 find_all() 方法的 attrs 参数

    • 定义一个字典参数来搜索包含特殊属性的tag

    • 参考实例67_21

5.3.3. CSS搜索

  • 标识CSS类名的关键字 class 在Python中是保留字,

    • 使用 class 做参数会导致语法错误.从Beautiful Soup的4.1.1版本开始,
    • 可以通过 class_ 参数搜索有指定CSS类名的tag
  • class_ 参数

    • 同样接受不同类型的 过滤器 ,字符串,正则表达式,方法或 True
    • 参考实例67_22
  • string 参数

    • 搜文档中的字符串内容.与 name 参数的可选值一样
    • soup.find_all(string=“Elsie”)
    • 和tag标签混合使用
    • soup.find_all(“a”, string=“Elsie”)
  • 补充

  • find_all() 几乎是Beautiful Soup中最常用的搜索方法

  • 语法可以简写,以下写法等价

      soup.find_all("a")
      soup("a")
      
      soup.title.find_all(string=True)
      soup.title(string=True)
    

5.3.4. find()

  • find( name , attrs , recursive , string , **kwargs )

  • 比如文档中只有一个标签,那么使用 find_all() 方法

  • 来查找标签就不太合适,

  • 使用 find_all 方法并设置 limit=1 参数不如直接使用 find() 方法

  • 下面代码等价

      soup.find_all('title', limit=1)
      [<title>The Dormouse's story</title>]
      
      soup.find('title')
      <title>The Dormouse's story</title>
      
      - 唯一的区别是 find_all() 方法的返回结果是值包含一个元素的列表,
      - 而 find() 方法直接返回结果     
    
  • find_parents( name , attrs , recursive , string , **kwargs )

  • find_parent( name , attrs , recursive , string , **kwargs )

  • find_all() 和 find() 只搜索当前节点的所有子节点,孙子节点等.

  • find_parents() 和 find_parent() 用来搜索当前节点的父辈节点,

  • find_all_next() 和 find_next()

  • find_all_previous() 和 find_previous()

5.4. 修改文档树

  • 修改方法类似python中的赋值

  • 语法如下
    soup = BeautifulSoup(‘Extremely bold’)
    tag = soup.b

    tag.name = “blockquote”
    tag[‘class’] = ‘verybold’
    tag[‘id’] = 1
    tag

    Extremely bold

本章案例较多:
源代码请到GITHUB下载:
https://github.com/FangbaiZhang/TLXY_study_note/tree/master/Spider

下接:
Python3网络爬虫教程15——BeautifulSoup4中的编码,格式化,解析器的区别
https://blog.csdn.net/u011318077/article/details/86633466

猜你喜欢

转载自blog.csdn.net/u011318077/article/details/86633433