遍历文档树

子节点

  • 一个Tag可能包含多个字符串或其它的Tag,这些都是这个Tag的子节点.Beautiful Soup提供了许多操作和遍历子节点的属性.

  • 注意: Beautiful Soup中字符串节点不支持这些属性,因为字符串没有子节点

1. tag的名字

  • 操作文档树最简单的方法就是告诉它你想获取的tag的name.如果想获取 <head>标签,只要用 soup.head :

  • 这是个获取tag的小窍门,可以在文档树的tag中多次调用这个方法.下面的代码可以获取<body>标签中的第一个<b>标签:

  • 通过点取属性的方式只能获得当前名字的第一个tag:

  • 如果想要得到所有的<a>标签,或是通过名字得到比一个tag更多的内容的时候,就需要用到搜索文档树中描述的方法,比如: find_all()

2. .contents 和 .children

  • tag的.contents属性可以将tag的子节点以列表的方式输出:

  • BeautifulSoup 对象本身一定会包含子节点,也就是说<html>标签也是 BeautifulSoup 对象的子节点:

  • 字符串没有 .contents 属性,因为字符串没有子节点:

  • 通过tag的 .children 生成器,可以对tag的子节点进行循环:

3. .descendants

  • .contents.children 属性仅包含tag的直接子节点.例如,<head>标签只有一个直接子节点<title>

head_tag.contents# [<title>The Dormouse's story</title>]
  • 但是标签也包含一个子节点:字符串 “The Dormouse’s story”,这种情况下字符串 “The Dormouse’s story”也属于<head>标签的子孙节点. .descendants 属性可以对所有tag的子孙节点进行递归循环(先序遍历):

for child in head_tag.descendants:print(child)# <title>The Dormouse's story</title># The Dormouse's story

上面的例子中, <head>标签只有一个子节点,但是有2个子孙节点:<head>节点和<head>的子节点, BeautifulSoup 有一个直接子节点(<html>节点),却有很多子孙节点:


len(list(soup.children))# 1len(list(soup.descendants))# 25

4. .string

  • 如果tag只有一个 NavigableString 类型子节点,那么这个tag可以使用 .string得到子节点:

title_tag.string# u'The Dormouse's story'

如果一个tag仅有一个子节点,那么这个tag也可以使用 .string 方法,输出结果与当前唯一子节点的 .string 结果相同:


head_tag.contents# [<title>The Dormouse's story</title>]

head_tag.string# u'The Dormouse's story'

如果tag包含了多个子节点,tag就无法确定 .string 方法应该调用哪个子节点的内容, .string 的输出结果是 None :


print(soup.html.string)# None

5. .strings 和 stripped_strings

父节点

  • 每个tag或字符串都有父节点:被包含在某个tag中

1. .parent

  • 通过.parent属性来获取某个元素的父节点.在例子文档中,<head>标签是<title>标签的父节点:

  • 文档title的字符串也有父节点:

    标签
  • 文档的顶层节点比如<html>的父节点是 BeautifulSoup 对象:

  • BeautifulSoup 对象的 .parent 是None:

2. .parents

  • 通过元素的 .parents 属性可以递归得到元素的所有父辈节点,下面的例子使用了 .parents 方法遍历了<a>标签到根节点的所有节点

兄弟节点


sibling_soup = BeautifulSoup("<a><b>text1</b><c>text2</c></b></a>")print(sibling_soup.prettify())# <html># <body># <a># <b># text1# </b># <c># text2# </c># </a># </body># </html>

因为标签和标签是同一层:他们是同一个元素的子节点,所以和可以被称为兄弟节点.一段文档以标准格式输出时,兄弟节点有相同的缩进级别.在代码中也可以使用这种关系.

1. .next_sibling 和 .previous_sibling

  • 在文档树中,使用 .next_sibling.previous_sibling 属性来查询兄弟节点:

  • 例子中的字符串“text1”和“text2”不是兄弟节点,因为它们的父节点不同:

  • 实际文档中的tag的.next_sibling.previous_sibling 属性通常是字符串或空白.


<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a><a href="http://example.com/lacie" class="sister" id="link2">Lacie</a><a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>

如果以为第一个<a>标签的.next_sibling 结果是第二个<a>标签,那就错了,真实结果是第一个<a>标签和第二个<a>标签之间的顿号和换行符:

第二个<a>标签是顿号的 .next_sibling 属性:

2. .next_siblings 和 .previous_siblings

  • 通过 .next_siblings 和 .previous_siblings 属性可以对当前节点的兄弟节点迭代输出:

回退和前进


<html><head><title>The Dormouse's story</title></head><p class="title"><b>The Dormouse's story</b></p>

HTML解析器把这段字符串转换成一连串的事件: “打开标签”,”打开一个

标签”,”打开一个标签”,”添加一段字符串”,”关闭标签”,”打开

标签”,等等.Beautiful Soup提供了重现解析器初始化过程的方法.

1. .next_element 和 .previous_element

.next_element 属性指向解析过程中下一个被解析的对象(字符串或tag),结果可能与.next_sibling相同,但通常是不一样的.

这是文档中最后一个<a>标签,它的 .next_sibling 结果是一个字符串,因为当前的解析过程 [2] 因为当前的解析过程因为遇到了<a>标签而中断了:


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.'

但这个<a>标签的.next_element属性结果是在<a>标签被解析之后的解析内容,不是<a>标签后的句子部分,应该是字符串”Tillie”:


last_a_tag.next_element# u'Tillie'

这是因为在原始文档中,字符串“Tillie” 在分号前出现,解析器先进入<a>标签,然后是字符串“Tillie”,然后关闭</a>标签,然后是分号和剩余部分.分号与<a>标签在同一层级,但是字符串“Tillie”会被先解析.

.previous_element 属性刚好与 .next_element相反,它指向当前被解析的对象的前一个解析对象:

2. .next_elements 和 .previous_elements

  • 通过 .next_elements 和 .previous_elements 的迭代器就可以向前或向后访问文档的解析内容,就好像文档正在被解析一样:

转载于:https://www.cnblogs.com/lalavender/p/10744880.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/411650.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[html] html5中的form怎么关闭自动完成?

[html] html5中的form怎么关闭自动完成&#xff1f; 设置form的autocomplete属性为off个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

如何开通支付宝

一、登录支付宝网站注册&#xff1a; 1、注册支付宝账户 1&#xff09;进入支付宝网站https://www.alipay.com/点击“免费注册”按钮 进入支付宝网站https://www.alipay.com/&#xff0c;如果图片有不显示的&#xff0c;请刷新一下&#xff0c;或者将鼠标放到红叉的位置&#x…

mysql的aborted_mysql参数:aborted_connects过大

mysql参数&#xff1a;aborted_connects过大(2015-12-31 11:32:08)标签&#xff1a;mysql运维it如果一个客户端在成功连接之后&#xff0c;不正常中断或结束&#xff0c;Aborted_connects将会增加1&#xff0c;并会将日志记录到error日志里。(log_warning设置为2才会记录)原因可…

[html] label都有哪些作用?并举相应的例子说明

[html] label都有哪些作用&#xff1f;并举相应的例子说明 label通常用来关联一个表单控件<label for"hobby">爱好</label> <input id"hobby" type"checkbox" value"0">个人简介 我是歌谣&#xff0c;欢迎和大家一…

小白学docker(1)---docker安装

最近学习下docker&#xff0c;并且工作需要&#xff0c;就总结下。 1、Docker安装 a、先查看下CentOS版本 b、查看下Linux内核版本 c、执行wget -qO- https://get.docker.com/|sh 其实就是一个执行脚本来快速安装开发环境docker d、启动sudo systemctl docker start 执行命令确…

java mysql 异步查询数据库_java 异步操作数据库

Autowiredprivate ThreadPoolTaskExecutor threadPoolTaskExecutor;threadPoolTaskExecutor.execute(new UpdateDbCdkeyStatus(AcvitityId, couponCode, money));/*** 记录coupon到数据库*/private class UpdateDbCdkeyStatus implements Runnable {private String couponCode;…

.NET平台依赖注入机制及IoC的设计与实现

我们设计的分层架构&#xff0c;层与层之间应该是松散耦合的。因为是单向单一调用&#xff0c;所以&#xff0c;这里的“松散耦合”实际是指上层类不能具体依赖于下层类&#xff0c;而应该依赖于下层提供的一个接口。这样&#xff0c;上层类不能直接实例化下层中的类&#xff0…

工作377-处理url拼接里面的参数方法

function GetRequest() {var url location.search; //获取url中"?"符后的字串var theRequest new Object();if (url.indexOf("?") ! -1) {var str url.substr(1);strs str.split("&");for(var i 0; i < strs.length; i ) {theRequ…

1020.数字识别

来源&#xff1a;oj.noi.cn时间限制: 1000 ms 空间限制: 262144 KB题目描述输入一个不多于四位的正整数&#xff0c;求出它是几位数&#xff0c;并分别打印出各位上的数字。输入输入一个不多于四位的正整数x。输出第一行输出x的位数num&#xff0c;接下来num行从高位到低位输出…

php嵌套查询mysql语句_mysql 查询嵌套

问题描述 为使讨论简单易懂&#xff0c;我将问题稍作简化&#xff0c;去掉诸多的背景。 从前有一个皇帝&#xff0c;他有50个妃子&#xff0c;这些妃子很没有天理的给他生了100,000个儿子&#xff0c;于是&#xff0c;皇帝很苦恼&#xff0c;海量的儿子很难管理&#xff0c;而且…

工作378-封装axios方法

const apiBaseUrl http://118.178.180.86:9000const service axios.create({baseURL: apiBaseUrl,timeout: 10000 });/*拦截器获取token地址*/ service.interceptors.request.use(function(config) {var Request new Object();Request GetRequest();let tokenRequest.token…

爬虫之request

目录 爬虫基本流程request和responserequestresponse演示解析方式requests库基本get请求1. 基本写法2. 带参数get请求3. 解析json4. 获取二进制数据5. 添加headers基本post请求响应状态码判断&#xff1a;高级操作beautifulsoup库爬取汽车之家示例爬虫基本流程 发起请求&#x…

工作379-回调日期补0操作

var data econsole.log(this.continuousDays, "continuousDays")data data.setDate(data.getDate() this.continuousDays);data new Date(e);console.log(data, "data")let dateYear1 data.getFullYear(); //获取年console.log(dateYear1, "date…

征途pak文件修改_传奇技能,第十四祭:装备属性修改与增加新装备

技能献祭&#xff0c;Get 新技能&#xff1a;传奇技能——应用篇&#xff0c;增加新装备与绑特效跟航家学技能&#xff0c;用正式服带你飞&#xff0c;底部有配套学习资源场景&#xff1a;游戏中装备的属性是可以修改的&#xff0c;基础攻防属性可以直接在物品数据库中修改&…

8月18日 小雨

小爱&#xff0c;昨天你睡的很可爱 呵呵 我今天没晚&#xff0c;居然提前20分钟自己醒了。 刚来公司&#xff0c;就收到经理通知&#xff0c;中午大家要去开发区吃饭&#xff0c;下午事都处理完就可能放假&#xff0c;HOHO。 提前告诉小爱&#xff0c;不要着急。 我爱你 转载于…

python tornado对接权限中心的sdk封装

# -*- coding: utf-8 -*- import jsonimport requests import logging as loggerfrom python.akskapp.scripts.api.baseHandler import Rclass AuthSdk(object):# 登录def loginToAuthcenter(self, username, password):resp Noneheaders {"Content-Type": "a…

mysql事务模式怎么查_Mysql InnoDB中的查询事务模式与锁定select ..for update

在 InnoDB 的行锁中使用所谓的 next-key locking。这就意味着&#xff0c;除了索引记录外&#xff0c;InnoDB 还可以锁定该索引记录前部“间隙” (gap) 以阻塞其它用户在索引记录前部的直接插入。next-key lock 意思是锁定一个索引记录以及该记录之前的间隙(gap)。gap lock 就是…

[jQuery] jQuery中如何将数组转化为json字符串,然后再转化回来?

[jQuery] jQuery中如何将数组转化为json字符串&#xff0c;然后再转化回来&#xff1f; var typeOf obj > Object.prototype.toString.call(obj); typeOf([1]); // "[object Array]" typeOf($([1])); // "[object Object]" $([1]).toArray();个人简…

.NET反射、委托技术与设计模式

转自&#xff1a;http://hi.baidu.com/nanashitou/blog/item/ad7346eed769ffffb2fb958a.html 1 反射技术与设计模式 反射&#xff08;Reflection&#xff09;是.NET中的重要机制&#xff0c;通过放射&#xff0c;可以在运行时获得.NET中每一个类型&#xff08;包括类、…

python之yield的一些应用

生成器 yield是用于生成器。生成器通俗的认为&#xff0c;在一个函数中&#xff0c;使用了yield来代替return的位置的函数&#xff0c;就是生成器。它不同于函数的使用方法是&#xff1a;函数使用return来进行返回值&#xff0c;每调用一次&#xff0c;返回一个新加工好的数据返…