03_BeautifulSoup的使用2-搜索文档树

搜索文档树

上一篇:
find() 和 find_all()是搜索文档时,主要使用的方法。

1、find_all():

find_all( name , attrs , recursive , text , **kwargs )

find_all()是通过过滤器进行文档查找的。支持的参数包括:

  • 字符串
  • 正则表达式
  • 列表
  • True
  • 自定义方法
image.png

find_all的使用示例:

查找目标:查找个人首页中,我的文集
# 获取
    下的所以子标签 essays = bsobj.find_all('ul', attrs={'class': 'list'}) print(len(essays))
  • 采用上面的代码,输出结果是2,则存在2个标签满足条件,还需要进行进一步的过滤,才能获取到结果信息。
  • 由于要获取的文集信息为ul标签的子标签,可以尝试获取ul标签的所有子标签,由于文集具有跳转链接,文集的跳转链接中,包含nb,可以采用正则表达式去匹配带有文集信息的标签:
import re
essays = bsobj.find_all('a', attrs={'class': 'name'}, href=re.compile("^/nb/"))
print(essays)

结果:返回了我的文集中的所有标签信息。

[
          python接口测试_base
          
, 
          工具_Loadrunner的使用
          
, 
          性能测试_基础
          
, 
          Jmeter-初识
          
]
  • 思考问题:想要获取href属性的值和text信息,并存储为json格式信息或者字典,应该怎么操作呢?
import re
essays = bsobj.find_all('a', attrs={'class': 'name'}, href=re.compile("^/nb/"))
essay_dict = {}
for essay in essays:
    essay_link = essay['href']
    essay_name = essay.text
    essay_dict[essay_name.strip()] = essay_link

print(essay_dict)
print(type(essay_dict))

import json
essay_json = json.dumps(essay_dict)
print(type(essay_json))

结果:

{'python接口测试_base': '/nb/23293583', '工具_Loadrunner的使用': '/nb/21337746', '性能测试_基础': '/nb/15263522', 'Jmeter-初识': '/nb/15008171'}


2、find

find( name , attrs , recursive , text , **kwargs )

def find(self, name=None, attrs={}, recursive=True, text=None, **kwargs):
  • find_all() 方法将返回文档中符合条件的所有tag,当文档中只有一个标签,那么使用 find_all() 方法来查找标签就不太合适, 使用 find_all 方法并设置 limit=1 参数不如直接使用 find() 方法。
  • 唯一的区别是 find_all() 方法的返回结果是值包含一个元素的列表,而 find() 方法直接返回结果
  • find_all() 方法没有找到目标是返回空列表, find() 方法找不到目标时,返回 None

3、find_parents() 和 find_parent()

4、find_next_siblings() 和find_next_sibling()

5、find_previous_siblings() 和 find_previous_sibling()

6、find_all_next() 和 find_next()

7、find_all_previous() 和 find_previous()

3、4、5、6、7中的方法,支持的参数与find_all()和find()相同,方法的功能与遍历文档树中介绍的相对应。理解了前面的内容,对这几个方法就很好理解了。

8、CSS选择器

def select(self, selector, _candidate_generator=None, limit=None):

Beautiful Soup支持大部分的CSS选择器,在TagBeautifulSoup中传入select()方法中传入字符串参数,即可使用CSS选择器的语法找到tag.

  • 要运用CSS选择器,首先要掌握CSS选择器的语法
  • 参考菜鸟教程:http://www.runoob.com/cssref/css-selectors.html
支持的查找方式
  • 通过Tag标签逐层查找
  • 找到某个tag标签下的直接子标签
  • 找到兄弟节点标签
  • 通过CSS的类名查找
  • 通过tag的id查找
  • 通过是否存在某个属性来查找
  • 通过属性的值来查找
  • 通过语言设置来查找
示例

根据选择器语法进行练习获取标签信息就可以啦:

  • 查找文集的标签信息(以下的方式都可以):
title = bsobj.select('[href] ~ .name')
title = bsobj.select('a[class=name]')
title = bsobj.select('div > ul > li > a[class=name]')
print(title)
[
          python接口测试_base
          
, 
          工具_Loadrunner的使用
          
, 
          性能测试_基础
          
, 
          Jmeter-初识
          
]

总结

  • 搜索文档树在BeautifulSoup中是最常用的功能
  • 尤其需要掌握find_all()和find()方法的使用,灵活运用各类过滤器获取标签信息
  • 如果对于CSS选择器的语法熟练,采用CSS选择器搜索文档也是非常好用的哟

你可能感兴趣的:(03_BeautifulSoup的使用2-搜索文档树)