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