BeautifulSoup的高级应用 之.parent .parents .next_sibling.previous_sibling.next_siblings.previous_siblings
来源:互联网 发布:数据分析 ppt 编辑:程序博客网 时间:2024/05/29 17:57
继上一篇BeautifulSoup的高级应用,主要讲解的是contents children descendants string strings stripped_strings,本篇主要讲解.parent .parents .next_sibling .previous_sibling .next_siblings .previous_siblings
本篇博客继续使用上篇的html页面内容:
html_doc = """ <html><head><title>The Dormouse's story</title></head> <p class="title"><b>The Dormouse's story</b></p> <p class="story">Once upon a time there were three little sisters; and their names were <a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>, <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>; and they lived at the bottom of a well.</p> <p class="story">...</p> </html>"""
继续分析文档树 ,每个 tag或字符串都有父节点 :被包含在某个 tag中
.parent:
通过 .parent 属性来获取某个元素的父节点.在例子html文档中,标签是标签的父节点:
title_tag = soup.title title_tag# <title>The Dormouse's story</title> title_tag.parent # <head><title>The Dormouse's story</title></head>
文档title的字符串也有父节点:标签
title_tag.string.parent # <title>The Dormouse's story</title>
文档的顶层节点比如的父节点是 BeautifulSoup 对象:
html_tag = soup.html type(html_tag.parent) # <class 'bs4.BeautifulSoup'>
BeautifulSoup 对象的 .parent 是None。
.parents:
通过元素的.parents属性可以递归得到元素的所有父辈节点 , 下面的例子使用了 .parents方 法遍历了 标签到根节点 的所有节点:
link = soup.a link # <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a> for parent in link.parents: if parent is None: print(parent) else: print(parent.name) # p # body # html # [document] # None
兄弟节点:
举例说明:
<a> <b>text1</b> <c>text2</c></a>
这里的b和c节点为兄弟节点
.next_sibling 和 .previous_sibling .:
在文档树中 ,使用 .next_sibling 和 .previous_sibling 属性来查询兄弟节点:
sibling_soup = BeautifulSoup("<a><b>text1</b><c>text2</c></b></a>")sibling_soup.b.next_sibling # <c>text2</c> sibling_soup.c.previous_sibling # <b>text1</b>
b 标签有.next_sibling 属性 ,但是没有 .previous_sibling 属性 ,因为 b标签在同级节点中是第一个 .同理 ,c标签有 .previous_sibling 属性 ,却没有 .next_sibling 属性 。
link = soup.a link # <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a> link.next_sibling # u',\n'
注意:第一个a标签的next_sibling 属性值为 ,\n
link.next_sibling.next_sibling # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>
第一个a标签的next_sibling的next_sibling 属性值为Lacie
.next_siblings 和 .previous_siblings.:
通过 .next_siblings 和 .previous_siblings 属性对当前节点的兄弟节点迭代输出:
for sibling in soup.a.next_siblings: print(repr(sibling)) # u',\n' # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a> # u' and\n' # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a> # u'; and they lived at the bottom of a well.' # None for sibling in soup.find(id="link3").previous_siblings: print(repr(sibling)) # ' and\n' # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a> # u',\n'# <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a> # u'Once upon a time there were three little sisters; and their names were\n' # None
回退和前进:
举例html如下:
<html><head><title>The Dormouse's story</title></head> <p class="title"><b>The Dormouse's story</b></p>
HTML 解析器把这段字符串转换成一连的事件 : “ 打开标签 ”添加一段字符串 ”,关闭 标签 ”,”打开
标签 ”, 等.Beautiful Soup提供了重现解析器初始化过程的方法
.next_element 和 .previous_element .
.next_element 属性指向解析过程中下一个被的对象 (字符串或 tag),结果可能 与 .next_sibling 相同 ,但通常是不一样的 .
last_a_tag = soup.find("a", id="link3") last_a_tag # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a> last_a_tag.next_sibling # '; and they lived at the bottom of a well.'
但这个 标签的 .next_element 属性结果是在标签被解析之后的内容 ,不是 标 签后的句子部分 ,应该是字符串 ”Tillie”:
last_a_tag.next_element # u'Tillie'
.previous_element 属性刚好与.next_element 相反 ,它指向当前被解 析的对象的前一个解析对象 :
last_a_tag.previous_element # u' and\n' last_a_tag.previous_element.next_element# <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>
.next_elements 和 .previous_elements:
通过 .next_elements 和 .previous_elements 的迭代器就可以向前或后访问文档解析内容 ,就好像文档正在被解析一样 :
for element in last_a_tag.next_elements: print(repr(element)) # u'Tillie' # u';\nand they lived at the bottom of a well.' # u'\n\n' # <p class="story">...</p> # u'...' # u'\n' # None
下一篇 将讲解一下BeautifulSoup的搜索文档树的高级方法。
- BeautifulSoup的高级应用 之.parent .parents .next_sibling.previous_sibling.next_siblings.previous_siblings
- BeautifulSoup的高级应用 之 find findAll
- BeautifulSoup的高级应用 之 find findAll
- Jquery的parent和parents
- parent()与parents()的区别
- jQuery 之 parent、parents 和 closest 方法
- Jquery的parent()和parents()的bug?
- jquey的parent()和parents()的区别
- 关于Jquery的parent和parents
- 关于Jquery的parent和parents
- Jquery的parent,parents与children
- jquery parent和parents的区别分析
- jquery中parent和parents的运用
- 关于Jquery的parent和parents
- jquery中parent()与parents()的比较
- jquery parent 与 parents 的qubie
- 关于parent()、parents()和closest()的区别
- jquery的parent和parents方法区别
- 动态轮播
- linux 信号详解
- BinarySearchTree查找二叉树独立实现
- Scala 深入浅出实战经典 第10讲:Scala单例对象、伴生对象实战详解
- 代码实现Autolayout:使用NSLayoutConstraint对象
- BeautifulSoup的高级应用 之.parent .parents .next_sibling.previous_sibling.next_siblings.previous_siblings
- hdu-1874 畅通工程续(SPFA做法)
- Ubuntu14.04下搭建LAMP环境
- HDOJ 3790 最短路径问题(dijkstra算法)
- UrlRewriteFilter 简介
- HDU 1372(BFS)
- Matlab GUI 图像矩形剪切,并存储、发布
- 关于类文件从加载到运行的过程中内存的示意图
- 1.线程与进程概念性总结(初级)