关于爬虫,你需要知道的BeautifulSoup(二)
日拱一卒|数据挖掘015
阅读本文前建议先浏览:
本篇推送涉及的代码链接:https://github.com/piyixiaeco/daily-code/blob/master/Beautiful%20Soup.ipynb
二、使用BeautifulSoup
(二)遍历文档树
遍历文档树,即从根节点 html 标签开始遍历,直到找到目标元素为止,遍历的一个缺陷是,如果你要找的内容在文档的末尾,那么它要遍历整个文档才能找到它,速度上就慢了。因此还需要配合第二种方法:搜索文档树。
![](https://img.haomeiwen.com/i11013023/f825f34f3150da93.png)
以下面HTML文本为例
![](https://img.haomeiwen.com/i11013023/53c1ae15a0b84ab6.png)
获取标签节点可以直接通过 .标签名
方式获得
1.下行遍历
![](https://img.haomeiwen.com/i11013023/5eed0305c824738a.png)
![](https://img.haomeiwen.com/i11013023/89d2e69e6daf26b7.png)
![](https://img.haomeiwen.com/i11013023/1bc96feb7096cdeb.png)
![](https://img.haomeiwen.com/i11013023/dc41030831aae8bb.png)
2.上行遍历
![](https://img.haomeiwen.com/i11013023/59b422caa58016a0.png)
![](https://img.haomeiwen.com/i11013023/58dfed7ad50f7de4.png)
![](https://img.haomeiwen.com/i11013023/ce1deb5617299dea.png)
![](https://img.haomeiwen.com/i11013023/4e7908d474c69c7a.png)
遍历所有先辈节点,包括soup本身,所以要区别判断
3.平行遍历
![](https://img.haomeiwen.com/i11013023/085e5fd5f395d5bd.png)
遍历文档树的另一个缺点是只能获取到与之匹配的第一个子节点,例如,如果有两个相邻的 p 标签时,第二个标签就没法通过.p
的方式获取,这是需要借用 next_sibling 属性获取相邻的节点。
![](https://img.haomeiwen.com/i11013023/2cfccaa62f7b7e47.png)
![](https://img.haomeiwen.com/i11013023/f777efeb5665c9a5.png)
![](https://img.haomeiwen.com/i11013023/1badaa12c691ae5f.png)
需要注意:平行遍历发生在同一个父节点下的各节点间
![](https://img.haomeiwen.com/i11013023/f2d0f9a90437bce2.png)
小结
![](https://img.haomeiwen.com/i11013023/ae3708b8ec246a5b.png)
(三)搜索文档树
搜索文档树是通过指定标签名来搜索元素,还可以通过指定标签的属性值来精确定位某个节点元素,最常用的两个方法就是 find 和 find_all。
![](https://img.haomeiwen.com/i11013023/aadc1d014d956673.png)
![](https://img.haomeiwen.com/i11013023/7767b4ea12bace96.png)
![](https://img.haomeiwen.com/i11013023/739a1eb6a56ab562.png)
find 方法跟 find_all 类似,唯一不同的地方是,它返回的单个 Tag 对象而非列表,如果没找到匹配的节点则返回 None。如果匹配多个 Tag,只返回第0个。
注意:
find 和 find_all。这两个方法在 BeatifulSoup 和 Tag 对象上都可以被调用。
![](https://img.haomeiwen.com/i11013023/baaaf23e09c008b9.png)
![](https://img.haomeiwen.com/i11013023/96057f03253627ad.png)
补充:获取标签里面内容
获取标签里面内容,除了可以使用 .string 之外,还可以使用 get_text 方法,不同的地方在于前者返回的一个 NavigableString 对象,后者返回的是 unicode 类型的字符串。实际场景中我们一般使用 get_text 方法获取标签中的内容。
![](https://img.haomeiwen.com/i11013023/f7ee488d05e18c33.png)
参考资料:
1.Python爬虫知识点梳理
2.HTML文本解析库BeautifulSoup
3.Python网络爬虫与信息提取