BeautifulSoup的高级应用 之.parent .parents .next_sibling.previous_sibling.next_siblings.previous_siblings

继上一篇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的搜索文档树的高级方法。

时间: 2024-11-02 22:35:38

BeautifulSoup的高级应用 之.parent .parents .next_sibling.previous_sibling.next_siblings.previous_siblings的相关文章

jQuery查找——parent/parents/parentsUntil/closest

jquery的parent(),parents(),parentsUntil(),closest()都是向上查找父级元素,具体用法不同 parent():取得一个包含着所有匹配元素的唯一父元素的元素集合. parents():沿 DOM 树向上遍历,直到文档的根元素(<html>)为止,将每个祖先元素添加到一个临时的集合:如果应用了选择器,则会基于该选择器对这个集合进行筛选.返回零个.一个或多个元素. closest():沿 DOM 树向上遍历,直到找到已应用选择器的一个匹配为止.返回零个或一

BeautifulSoup的高级应用 之 contents children descendants string strings stripped_strings

继上一节,BeautifulSoup的高级应用 之 find findAll,这一节,主要讲解BeautifulSoup有关的其他几个重要应用函数. 本篇中,所使用的html为: html_doc = """ <html> <head><title>The Dormouse's story</title></head> <p class="title"><b>The Dor

jQuery中parent(), parents(), parentsUntil() 3个函数的区别

现象:在试用JQuery的时候遇到元素查找,过程中使用parentsUntil()和next()函数,但是老是得到undefined 原因:在jQuery官方文档中描述的这3个函数都返回jquery对象,实际则不是,parent()函数返回jquery对象,返回的是单个父元素对象,而parents()函数和parentsUntil()函数其中有个s,表明返回的是1个数组,parentsUntil()很逗,返回的是不包括选择器一级的父元素,比如你选择器写1个div,它并不返回包含这个 div的元素

jquery中closest()parent() parents 区别

parent是找当前元素的第一个父节点,不管匹不匹配都不继续往下找 parents是找当前元素的所有父节点  closest() 是找当前元素的所有父节点 ,直到找到第一个匹配的父节点 parent().parents()与closest()方法两两之间有类似又有不同,本篇简短的区分一下这三个方法.通过本篇内容,大家将会在以后使用.parent().parents()和closest()时不会显得无从下手. 我们直接看例子来来说明一下这三个方法的使用区别: [html] view plain c

jQuery 利用 parent() parents() 寻找父级 或祖宗元素

$(this).parent().parent().parent().parent().parent().remove(); //此方法通过parent()一级一级往上找   $(this).parents("div").remove();// 此方法是找出所有父级元素以及祖宗元素  通过"div" 筛选出祖宗中是div的祖先元素 parent是指取得一个包含着所有匹配元素的唯一父元素的元素集合. parents则是取得一个包含着所有匹配元素的祖先元素的元素集合(不

parent,parents和closest

1.parent parent() 获得当前匹配元素集合中每个元素的父元素,使用选择器进行筛选是可选的. 1 <ul id="menu" style="width:100px;"> 2 <li>Start</li> 3 <li> 4 <ul> 5 <li> 6 <ul> 7 <li><a href="#">Home</a><

jquery parent() parents() closest()区别

parent是找当前元素的第一个父节点,不管匹不匹配都不继续往下找 parents是找当前元素的所有父节点  closest() 是找当前元素的所有父节点 ,直到找到第一个匹配的父节点 parent().parents()与closest()方法两两之间有类似又有不同,本篇简短的区分一下这三个方法.通过本篇内容,大家将会在以后使用.parent().parents()和closest()时不会显得无从下手. 我们直接看例子来来说明一下这三个方法的使用区别: 1 <ul id="menu&q

jquery 常用选择器 回顾 ajax() parent() parents() children() siblings() find() eq()

1. $.ajax() ajax 本身是异步操作,当需要将 异步 改为 同步时: async: false 2.parent()  父级元素  和  parents() 祖先元素 的区别 parent是指取得一个包含着所有匹配元素的唯一父元素的元素集合.parents则是取得一个包含着所有匹配元素的祖先元素的元素集合(不包含根元素).可以通过一个可选的表达式进行筛选. 例如: <div id='div1'> <div id='div2'> <p></p> &

parent(),parents()与closest()的区别与详解

方法 例子 描述 parent() ????????????????????? 获得集合中每个匹配元素的父级元素 $('.item-1').parent().css('background-color','red'); parent()方法从指定类型的直接父节点开始查找. parent()返回一个元素节点. parents() ????? 获得集合中每个匹配元素的祖先元素 $('.item-1').parents('ul').css('background-color','red'); pare