python学习之----BeautifulSoup的find()和findAll()及四大对象
BeautifulSoup 里的find() 和findAll() 可能是你最常用的两个函数。借助它们,你可以通
过标签的不同属性轻松地过滤HTML 页面,查找需要的标签组或单个标签。
这两个函数非常相似,BeautifulSoup 文档里两者的定义就是这样:
findAll(tag, attributes, recursive, text, limit, keywords)
find(tag, attributes, recursive, text, keywords)
很可能你会发现,自己在95% 的时间里都只需要使用前两个参数:tag 和attributes。但
是,我们还是应该仔细地观察所有的参数。
标签参数tag 前面已经介绍过——你可以传一个标签的名称或多个标签名称组成的Python
列表做标签参数。例如,下面的代码将返回一个包含HTML 文档中所有标题标签的列表:1
.findAll({"h1","h2","h3","h4","h5","h6"})
属性参数attributes 是用一个Python 字典封装一个标签的若干属性和对应的属性值。例
如,下面这个函数会返回HTML 文档里红色与绿色两种颜色的span 标签:
.findAll("span", {"class":{"green", "red"}})
递归参数recursive 是一个布尔变量。你想抓取HTML 文档标签结构里多少层的信息?如果
recursive 设置为True,findAll 就会根据你的要求去查找标签参数的所有子标签,以及子
标签的子标签。如果recursive 设置为False,findAll 就只查找文档的一级标签。findAll
默认是支持递归查找的(recursive 默认值是True);一般情况下这个参数不需要设置,除
非你真正了解自己需要哪些信息,而且抓取速度非常重要,那时你可以设置递归参数。
文本参数text 有点不同,它是用标签的文本内容去匹配,而不是用标签的属性。假如我们
想查找前面网页中包含“the prince”内容的标签数量,我们可以把之前的findAll 方法换
成下面的代码:
nameList = bsObj.findAll(text="the prince")
print(len(nameList))
输出结果为“7”。
范围限制参数limit,显然只用于findAll 方法。find 其实等价于findAll 的limit 等于
1 时的情形。如果你只对网页中获取的前x 项结果感兴趣,就可以设置它。但是要注意,
这个参数设置之后,获得的前几项结果是按照网页上的顺序排序的,未必是你想要的那
前几项。
还有一个关键词参数keyword,可以让你选择那些具有指定属性的标签。例如:
allText = bsObj.findAll(id="text")
print(allText[0].get_text())
关键词参数的注意事项
虽然关键词参数keyword 在一些场景中很有用,但是,它是BeautifulSoup 在
技术上做的一个冗余功能。任何用关键词参数能够完成的任务,同样可以用
其他技术解决
例如,下面两行代码是完全一样的:
bsObj.findAll(id="text")
bsObj.findAll("", {"id":"text"})
另外,用keyword 偶尔会出现问题,尤其是在用class 属性查找标签的时候,
因为class 是Python 中受保护的关键字。也就是说,class 是Python 语言
的保留字,在Python 程序里是不能当作变量或参数名使用的(和前面介绍
的BeautifulSoup.findAll() 里的keyword 无关)2。假如你运行下面的代码,
Python 就会因为你误用class 保留字而产生一个语法错误:
bsObj.findAll(class="green")
不过,你可以用BeautifulSoup 提供的有点儿臃肿的方案,在class 后面增加
一个下划线:
bsObj.findAll(class_="green")
另外,你也可以用属性参数把class 用引号包起来:
bsObj.findAll("", {"class":"green"})
看到这里,你可能会扪心自问:“现在我是不是已经知道如何用标签属性获取一组标签
了——用字典把属性传到函数里就行了?”
回忆一下前面的内容,通过标签参数tag 把标签列表传到.findAll() 里获取一列标签,其
实就是一个“或”关系的过滤器(即选择所有带标签1 或标签2 或标签3……的一列标
签)。如果你的标签列表很长,就需要花很长时间才能写完。而关键词参数keyword 可以让
你增加一个“与”关系的过滤器来简化工作。
BeautifulSoup的四大对象
• BeautifulSoup 对象
前面代码示例中的bsObj
• 标签Tag 对象
BeautifulSoup 对象通过find 和findAll,或者直接调用子标签获取的一列对象或单个
对象
NavigableString 对象
用来表示标签里的文字,不是标签(有些函数可以操作和生成NavigableString 对象,
而不是标签对象)。
• Comment 对象
用来查找HTML 文档的注释标签,<!-- 像这样 -->
这四个对象是你用BeautifulSoup 库时会遇到的所有对象。
python学习之----BeautifulSoup的find()和findAll()及四大对象的更多相关文章
- python学习(25) BeautifulSoup介绍和实战
BeautifulSoup是python的html解析库,处理html非常方便 BeautifulSoup 安装 pip install beautifulsoup4 BeautifulSoup 配合 ...
- Python学习笔记(4):容器、迭代对象、迭代器、生成器、生成器表达式
在了解Python的数据结构时,容器(container).可迭代对象(iterable).迭代器(iterator).生成器(generator).列表/集合/字典推导式(list,set,dict ...
- python学习之BeautifulSoup模块爬图
BeautifulSoup模块爬图学习HTML文本解析标签定位网上教程多是爬mzitu,此网站反爬限制多了.随意找了个网址,解析速度有些慢.脚本流程:首页获取总页数-->拼接每页URL--> ...
- python学习之----BeautifulSoup示例二
网络爬虫可以通过class 属性的值,轻松地区分出两种不同的标签.例如,它们可以用 BeautifulSoup 抓取网页上所有的红色文字,而绿色文字一个都不抓.因为CSS 通过属性准 确地呈现网站的样 ...
- python学习之----BeautifulSoup示例一
BeautifulSoup 库最常用的对象恰好就是BeautifulSoup 对象. from urllib.request import urlopen from bs4 import Beauti ...
- python学习_应用pickle模块封装和拆封数据对象
学习文件数据处理的时候了解到有pickle模块,查找官方文档学习了一些需要用到的pickle内容. 封装是一个将Python数据对象转化为字节流的过程,拆封是封装的逆操作,将字节文件或字节对象中的字节 ...
- python 学习笔记2(list/directory/文件对象/模块/参数传递)
### Python的强大很大一部分原因在于,它提供有很多已经写好的,可以现成用的对象. 11. list list是一个类.每个列表都属于该类. >>>nl = [1,2,5,3, ...
- Python学习手册之内部方法、操作符重载和对象生命周期
在上一篇文章中,我们介绍了 Python 的类和继承,现在我们介绍 Python 的内部方法.操作符重载和对象生命周期. 查看上一篇文章请点击:https://www.cnblogs.com/dust ...
- python学习Day14 带参装饰器、可迭代对象、迭代器对象、for 迭代器工作原理、枚举对象、生成器
复习 函数的嵌套定义:在函数内部定义另一个函数 闭包:被嵌套的函数 -- 1.外层通过形参给内层函数传参 -- 2.返回内部函数对象----> 延迟执行, 开放封闭原则: 功能可以拓展,但源代 ...
随机推荐
- Hadoop HDFS元数据目录分析
元数据目录分析 在第一次部署好Hadoop集群的时候,我们需要在NameNode(NN)节点上格式化磁盘: $HADOOP_HOME/bin/hdfs namenode -format 格式化完成之后 ...
- kindeditor在线编辑器的使用心得
1. 如何声明引用? <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> ...
- 【python】多线程详解
一.进程与线程关系 一个进程至少包含一个线程. 二.线程基础 1.线程的状态 线程有5种状态,状态转换的过程如下图所示: 2.线程同步(锁) 多线程的优势在于可以同时运行多个任务(至少感觉起来是这样) ...
- Windows Azure Virtual Network (12) 虚拟网络之间点对点连接VNet Peering
<Windows Azure Platform 系列文章目录> 在有些时候,我们需要通过VNet Peering,把两个虚拟网络通过内网互通互联.比如: 1.在订阅A里的Virtual N ...
- IIS - 自动申请、部署Let's Encrypt的免费SSL证书(让网站实现HTTPS协议)
IIS - 自动申请.部署Let's Encrypt的免费SSL证书(让网站实现HTTPS协议) 2017-12-19发布:hangge阅读:161 一.HTTPS 协议介绍 1,什么是 HTTP ...
- object.key 对象的键排序 可能出现的问题
// 09-集成提测工作流var node_list_info09 = { '090101': '客户端集成自测', '090201': '编译配置', '090202': '编译出包', '0903 ...
- C# 基于大整数类的RSA算法实现(公钥加密私钥解密,私钥加密公钥解密)
但是C#自带的RSA算法类RSACryptoServiceProvider只支持公钥加密私钥解密,即数字证书的使用. 所以参考了一些网上的资料写了一个RSA的算法实现.算法实现是基于网上提供的一个大整 ...
- LeetCode——8. String to Integer (atoi)
一.题目链接:https://leetcode.com/problems/string-to-integer-atoi/ 二.题目大意: 实现一个和C语言里atoi具有相同功能的函数,即能够把字符串转 ...
- python写xml及几个问题
python写xml的库和用法 几个问题: 1.乱码问题 设写入UTF-8编码 write函数增加encoding='utf-8' 2.空元素xml节点简写及完整写 write函数增加 short_e ...
- 玄学曲线并不玄 教你如何看懂GPU呈现
红色代表了“执行时间”,它指的是Android渲染引擎执行盒子中这些绘制命令的时间,假如当前界面的视图越多,那么红色便会“跳”得越高.实际使用中,比如我们平时刷淘宝App时遇到出现多张缩略图需要加载时 ...