内容提取神器 beautiful Soup 的用法

上篇文章只是简单讲述正则表达式如何读懂以及 re 常见的函数的用法 。我们可能读懂别人的正则表达式,但是要自己写起正则表达式的话,可能会陷入如何写的困境 。正则表达式写起来费劲又出错率高,那么有没有替代方案呢?俗话说得好,条条道路通罗马 。目前还两种代替其的办法,一种是使用 Xpath 神器,另一种就是本文要讲的。
1简介
引用官网的说明:
Soup is afordata out of HTML and XML files. It works with yourtoways of , , andthe parse tree. Itsaveshours or days of work.
大致意思如下:是一个能从 HTML 或 XML 文件中提取数据的库 。它能通过自己定义的解析器来提供导航、搜索,甚至改变解析树 。它的出现,会大大节省开发者的时间 。
2 安装
目前最新版本是 4.6.0,它是支持 的 。所以可以大胆去升级安装使用 。
安装方法有两种:
3 初始
首先导入库,然后创建一个对象,再利用对象做文章 。
上面代码中, 可以或者请求返回的内容,也可以是本地 HTML 文本 。如果要打开本地,代码需要改为
soup.()函数的作用是打印整个 html 文件的 dom 树,例如上面执行结果如下:
4 解析对象
想从 html 中获取到自己所想要的内容,我归纳出三种办法:
1)利用 Tag 对象

内容提取神器 beautiful Soup 的用法

文章插图
从上文得知, 将复杂 HTML 文档转换成一个复杂的树形结构,每个节点都是对象 。跟安卓中的Gson库有异曲同工之妙 。节点对象可以分为 4 种:Tag, , ,。
Tag 对象可以看成 HTML 中的标签 。这样说,你大概明白具体是怎么回事 。我们再通过例子来更加深入了解 Tag 对象 。以下代码是以 () 打印的结果为前提 。
获取head标签内容
获取title标签内容
获取p标签内容
如果 Tag 对象要获取的标签有多个的话,它只会返回所以内容中第一个符合要求的标签 。
对象一般含有属性,Tag 对象也不例外 。它具有两个非常重要的属性, name 和 attrs 。
name
attrs
其他三个属性也顺带介绍下:
说白了就是:Tag 对象里面的内容
对象表示的是一个文档的全部内容.大部分时候,可以把它当作 Tag 对象 。它是一个特殊的 Tag 。
【内容提取神器 beautiful Soup 的用法】 对象是一个特殊类型的对象 。如果 HTML 页面中含有注释及特殊字符串的内容 。而那些内容不是我们想要的,所以我们在使用前最好做下类型判断 。例如:
2)利用过滤器
过滤器其实是一个()函数, 它会将所有符合条件的内容以列表形式返回 。它的构造方法如下:
name 参数可以有多种写法:
另外 attrs 参数可以也作为过滤条件来获取内容,而 limit 参数是限制返回的条数 。
3)利用 CSS 选择器
以 CSS 语法为匹配标准找到 Tag 。同样也是使用到一个函数,该函数为(),返回类型也是 list 。它的具体用法如下, 同样以 () 打印的结果为前提:
5 处理上下关系
从上文可知,我们已经能获取到节点对象,但有时候需要获取其父节点或者子节点的内容,我们要怎么做了?这就需要对parse tree进行遍历
(1)获取子节点.属性,该属性会返回当前节点所以的子节点 。但是它返回的类型不是列表,而是迭代器
(2)获取所有子孙节点.属性,它会返回所有子孙节点的迭代器
(3)获取父节点.属性可以获得所有子孙节点的迭代器
(4)获取所有父节点.属性,也是返回所有子孙节点的迭代器
(5)获取兄弟节点.属性获取了该节点的下一个兄弟节点,.则与之相反,如果节点不存在,则返回 None
注意:实际 HTML 中的 tag 的.和 .属性通常是字符串或空白,因为空白或者换行也可以被视作一个节点,所以得到的结果可能是空白或者换行
(5)获取所有兄弟节点.和.属性可以对当前节点的兄弟节点迭代输出
推荐:详解
上文: 正则表达式