摘要:本次介绍使用对文档树的遍历。要注意的点在这里没有属性,因为它是同级节点中的第一个。字符串不是兄弟节点因为它们的父节点不同。和通过和的迭代器可以向前或向后访问文档的解析内容。
上一篇文章介绍了 BeautifulSoup 的安装以及基本对象类型。
本次介绍使用 bs4 对 HTML 文档树的遍历。
先把本文用到的例子贴上:
str = """bs4 test bs4 test
ab
"""
文档树的遍历:
文档树的遍历包括以下四部分:
子节点
父节点
兄弟节点
回退和前进
一、子节点
一个标签可能包含多个字符串或者其他标签,这些标签都属于子节点。要获取子节点,首先需要得到一个 Tag 对象:
获取一个 Tag 对象最简单的方式是用 bs4 对象点上要获取的标签的名字,同时支持链式调用。
bs4 = BeautifulSoup(str, "lxml") div_tag = bs4.div ul_tag = bs4.div.ul
.contents :
tag 对象的 .contents 属性可以将 tag 的子节点以列表的方式输出,不包含孙节点:
ul_tag.contents # [" ",
字符串没有 .contents 属性,因为字符串没有子节点。
.children:
.children 生成器,可以对 tag 的直接子节点进行循环:
for child in ul_tag.children: print(child) #
.descendants:
.descendants 属性可以对所有 tag 的子孙节点进行递归循环:
for child in ul_tag.descendants: print(child)
.string:
如果 tag 只有一个 NavigableString 类型子节点,那么这个 tag 可以使用 .string 得到子节点。
title_tag = bs4.title print(title_tag.string) # bs4 test
如果一个 tag 仅有一个子节点,那么这个 tag 也可以使用 .string 方法,输出结果与当前唯一子节点(也就是 title 节点)的 .string 结果相同。
head_tag = bs4.head print(head_tag.string) # bs4 test
如果 tag 包含了多个子节点,tag 就无法确定 .string 方法应该调用哪个子节点的内容,所以输出结果是 None:
print(div_tag.string) # None
.strings 和 stripped_strings:
对于上边 tag 包含了多个子节点的问题,可以使用 .strings 来循环获取:
for str in div_tag.strings: print(str) # PHP Python Golang
.stripped_strings 可以去除多余空白内容。
二、父节点
.parent:
.parent 属性来获取某个标签或字符串的父节点,比如:
print(title_tag.parent) #bs4 test h1_tag = bs4.h1 print(h1_tag.string.parent) #bs4 test
.parents:
.parents 属性可以递归得到元素的所有父辈节点。
for p in h1_tag.parents: print(p.name) # body html [document]
三、兄弟节点
首先先看一下例子中的这一行:
#abc
p_tag = bs4.p print(p_tag.prettify()) ## # a # # # b # # # c # #
都是的子节点,所以这三个可以被称为兄弟节点。
.next_sibling 和 .previous_sibling:
通过以上两个属性可以查询兄弟节点。
print(p_tag.i.next_sibling) # c
print(p_tag.i.previous_sibling) # a
要注意的点:
在这里没有 previous_sibling 属性,因为它是同级节点中的第一个。相反,没有 next_sibling 属性。
字符串“a,b,c”不是兄弟节点,因为它们的父节点不同。
由于我们上边的例子是写的一行,在实际中 .next_sibling 和 .previous_sibling 属性通常是字符串或空白。
如果示例是如下方式则 .next_sibling 和 .previous_sibling 获取到的是空白。
a b c
.next_siblings 和 .previous_siblings:
.next_siblings 和 .previous_siblings 属性可以对当前节点的兄弟节点迭代输出。
for sibling in p_tag.span.next_siblings:
print(repr(sibling))
#"
"
#b
#"
"
#c
#"
"
for prev in p_tag.em.previous_siblings:
print(repr(prev))
#"
"
#b
#"
"
#a
#"
"
四、回退和前进
HTML解析器把文档字符串转换成一连串的事件:
打开标签 -> 打开标签 -> 打开
Beautiful Soup提供了重现解析器初始化过程的方法。
.next_element 和 .previous_element:
.next_element 属性指向解析过程中下一个被解析的对象(字符串或tag)。
print(h1_tag.next_element) # bs4 test
因为这个结果是在标签被解析之后的解析内容,所以输出字符串。
print(h1_tag.next_element.previous_element) #bs4 test
h1_tag.next_element 输出的是“bs4 test”字符串,因为 .previous_element 指向当前被解析的对象的前一个解析对象,所以这里输出bs4 test
。
.next_elements 和 .previous_elements:
通过 .next_elements 和 .previous_elements 的迭代器可以向前或向后访问文档的解析内容。
str2 = "abc
" bs42 = BeautifulSoup(str2, "lxml") for element in bs42.p.next_elements: print(element) # a # a # b # b # c # c
以上就是本文总结的使用 Beautiful Soup 对文档遍历的相关内容。
有问题欢迎指出。关注我解锁更多 Python 干货哦!
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/42546.html
摘要:官方解释如下提供一些简单的式的函数用来处理导航搜索修改分析树等功能。废话不多说,我们来试一下吧安装目前已经停止开发,推荐在现在的项目中使用,不过它已经被移植到了,也就是说导入时我们需要。 上一节我们介绍了正则表达式,它的内容其实还是蛮多的,如果一个正则匹配稍有差池,那可能程序就处在永久的循环之中,而且有的小伙伴们也对写正则表达式的写法用得不熟练,没关系,我们还有一个更强大的工具,叫Be...
摘要:前面两篇介绍的是的基本对象类型和文档树的遍历本篇介绍的文档搜索搜索文档树主要使用两个方法和是用于搜索节点中所有符合过滤条件的节点那么它支持哪些过滤器呢过滤器的类型字符串正则表达式列表方法字符串查找文档中所有的标签正则表达式找出所有以开头的标 前面两篇介绍的是 Beautiful Soup 4 的基本对象类型和文档树的遍历, 本篇介绍 Beautiful Soup 4 的文档搜索 搜索文...
摘要:爬取糗百内容代码地址微信公众号智能制造社区,欢迎关注。爬虫程序一般是通过模拟浏览器对相应发出请求,获取数据,并通过正则等手段匹配出页面中我们所需的数据。库基本介绍是学习爬虫的一大利器。 爬取糗百内容 GitHub 代码地址https://github.com/injetlee/Python/blob/master/qiubai_crawer.py 微信公众号:【智能制造社区】,欢迎关注...
摘要:楚江数据是专业的互联网数据技术服务,现整理出零基础如何学爬虫技术以供学习,。本文来源知乎作者路人甲链接楚江数据提供网站数据采集和爬虫软件定制开发服务,服务范围涵盖社交网络电子商务分类信息学术研究等。 楚江数据是专业的互联网数据技术服务,现整理出零基础如何学爬虫技术以供学习,http://www.chujiangdata.com。 第一:Python爬虫学习系列教程(来源于某博主:htt...
摘要:文档写得很清楚,也有中文版,你只要看了最初的一小部分,就可以在代码中派上用场了。 关于爬虫的案例和方法,我们已讲过许多。不过在以往的文章中,大多是关注在 如何把网页上的内容抓取下来 。今天我们来分享下,当你已经把内容爬下来之后, 如何提取出其中你需要的具体信息 。 网页被抓取下来,通常就是 str 字符串类型的对象 ,要从里面寻找信息,最直接的想法就是直接通过字符串的 find 方法 ...
阅读 3477·2021-11-25 09:43
阅读 1223·2021-09-08 09:45
阅读 2612·2021-09-07 09:59
阅读 1443·2021-08-09 13:45
阅读 3256·2019-08-30 15:54
阅读 640·2019-08-29 18:35
阅读 461·2019-08-29 17:18
阅读 960·2019-08-29 14:10