搜索文档树
上一篇:
find() 和 find_all()是搜索文档时,主要使用的方法。
1、find_all():
find_all( name , attrs , recursive , text , **kwargs )
find_all()是通过过滤器进行文档查找的。支持的参数包括:
- 字符串
- 正则表达式
- 列表
- True
- 自定义方法
![](https://img.haomeiwen.com/i4917760/23ee9ebc5f731423.png)
find_all的使用示例:
查找目标:查找个人首页中,我的文集
# 获取<ul class="list">下的所以子标签
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)
结果:返回了我的文集中的所有标签信息。
[<a class="name" href="/nb/23293583" target="_blank">
python接口测试_base
<!-- -->
</a>, <a class="name" href="/nb/21337746" target="_blank">
工具_Loadrunner的使用
<!-- -->
</a>, <a class="name" href="/nb/15263522" target="_blank">
性能测试_基础
<!-- -->
</a>, <a class="name" href="/nb/15008171" target="_blank">
Jmeter-初识
<!-- -->
</a>]
- 思考问题:想要获取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'}
<class 'dict'>
<class 'str'>
2、find
find( name , attrs , recursive , text , **kwargs )
def find(self, name=None, attrs={}, recursive=True, text=None, **kwargs):
- find_all() 方法将返回文档中符合条件的所有tag,当文档中只有一个<body>标签,那么使用 find_all() 方法来查找<body>标签就不太合适, 使用 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选择器,在Tag
或BeautifulSoup
中传入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)
[<a class="name" href="/nb/23293583" target="_blank">
python接口测试_base
<!-- -->
</a>, <a class="name" href="/nb/21337746" target="_blank">
工具_Loadrunner的使用
<!-- -->
</a>, <a class="name" href="/nb/15263522" target="_blank">
性能测试_基础
<!-- -->
</a>, <a class="name" href="/nb/15008171" target="_blank">
Jmeter-初识
<!-- -->
</a>]
总结
- 搜索文档树在BeautifulSoup中是最常用的功能
- 尤其需要掌握find_all()和find()方法的使用,灵活运用各类过滤器获取标签信息
- 如果对于CSS选择器的语法熟练,采用CSS选择器搜索文档也是非常好用的哟
网友评论