内容提取神器 beautiful Soup 的用法
上篇文章只是简单讲述正则表达式如何读懂以及 re 常见的函数的用法。我们可能读懂别人的正则表达式,但是要自己写起正则表达式的话,可能会陷入如何写的困境。正则表达式写起来费劲又出错率高,那么有没有替代方案呢?俗话说得好,条条道路通罗马。目前还两种代替其的办法,一种是使用 Xpath 神器,另一种就是本文要讲的 。
1 简介
引用 官网的说明:
Soup is a for data out of HTML and XML files. It works with your to ways of , , and the parse tree. It saves hours or days of work.
大致意思如下: 是一个能从 HTML 或 XML 文件中提取数据的 库。它能通过自己定义的解析器来提供导航、搜索,甚至改变解析树。它的出现,会大大节省开发者的时间。
2 安装
目前 最新版本是 4.6.0,它是支持 的。所以可以大胆去升级安装使用。
安装方法有两种:
3 初始
首先导入 库,然后创建一个 对象,再利用对象做文章。
上面代码中, 可以或者请求返回的内容,也可以是本地 HTML 文本。如果要打开本地,代码需要改为
soup.()函数的作用是打印整个 html 文件的 dom 树,例如上面执行结果如下:
4 解析 对象
想从 html 中获取到自己所想要的内容,我归纳出三种办法:
1)利用 Tag 对象
从上文得知, 将复杂 HTML 文档转换成一个复杂的树形结构,每个节点都是对象。跟安卓中的Gson库有异曲同工之妙。节点对象可以分为 4 种:Tag, , , 。
Tag 对象可以看成 HTML 中的标签。这样说,你大概明白具体是怎么回事。我们再通过例子来更加深入了解 Tag 对象。以下代码是以 () 打印的结果为前提。
获取head标签内容
获取title标签内容
获取p标签内容
如果 Tag 对象要获取的标签有多个的话,它只会返回所以内容中第一个符合要求的标签。
对象一般含有属性,Tag 对象也不例外。它具有两个非常重要的属性, name 和 attrs。
name
attrs
其他三个属性也顺带介绍下:
说白了就是:Tag 对象里面的内容
对象表示的是一个文档的全部内容.大部分时候,可以把它当作 Tag 对象。它是一个特殊的 Tag。
对象是一个特殊类型的 对象。如果 HTML 页面中含有注释及特殊字符串的内容。而那些内容不是我们想要的,所以我们在使用前最好做下类型判断。例如:
2)利用过滤器
过滤器其实是一个()函数, 它会将所有符合条件的内容以列表形式返回。它的构造方法如下:
name 参数可以有多种写法:
另外 attrs 参数可以也作为过滤条件来获取内容,而 limit 参数是限制返回的条数。
3)利用 CSS 选择器
以 CSS 语法为匹配标准找到 Tag。同样也是使用到一个函数,该函数为(),返回类型也是 list。它的具体用法如下, 同样以 () 打印的结果为前提:
5 处理上下关系
从上文可知,我们已经能获取到节点对象,但有时候需要获取其父节点或者子节点的内容,我们要怎么做了?这就需要对parse tree进行遍历
(1)获取子节点.属性,该属性会返回当前节点所以的子节点。但是它返回的类型不是列表,而是迭代器
(2)获取所有子孙节点.属性,它会返回所有子孙节点的迭代器
(3)获取父节点.属性可以获得所有子孙节点的迭代器
(4)获取所有父节点.属性,也是返回所有子孙节点的迭代器
(5)获取兄弟节点.属性获取了该节点的下一个兄弟节点,.则与之相反,如果节点不存在,则返回 None
注意:实际 HTML 中的 tag 的.和 .属性通常是字符串或空白,因为空白或者换行也可以被视作一个节点,所以得到的结果可能是空白或者换行
(5)获取所有兄弟节点.和.属性可以对当前节点的兄弟节点迭代输出
推荐:详解
上文: 正则表达式