Error in user YAML: (<unknown>): found a tab character that violate indentation while scanning a plain scalar at line 3 column 3
---
- oeasy Python 0527
- 这是 oeasy 系统化 Python 教程,从基础一步步讲,扎实、完整、不跳步。愿意花时间学,就能真正学会。
- 本教程同步发布在:
- 个人网站: `https://oeasy.org`
- 蓝桥云课: `https://www.lanqiao.cn/courses/3584`
- GitHub: `https://github.com/overmind1980/oeasy-python-tutorial`
- Gitee: `https://gitee.com/overmind1980/oeasypython`
---- 上次 了解 树中的 元素关系
| 函数 | 作用 |
|---|---|
| getparent | 得到 父级 |
| getchildren | 得到 子集列表 |
| getprevious | 得到 哥哥 |
| getnext | 得到 弟弟 |
- 了解 etree 中的元素的成员变量
| text | tail | tag | attrib | |
|---|---|---|---|---|
| 含义 | 文本 | 尾部文本 | 标签 | 属性 |
| 类型 | 字符串 | 字符串 | 字符串 | 字典 |
- etree.tostring() 函数参数
- method = "text"
- 可以控制输出结果只包含 text 和 tail
- pretty_print = True
- 可以控制输出结果包含缩进信息
- method = "text"
- 想要把 节点下面
- 所有的节点 的文本
- 和 节点下 所有的子节点 文本
- 都找出来
- 要
怎么办 呢?🤔
- 先构造 元素树
- 简化代码实现
from lxml import etree
et_html = etree.Element ("html" )
etree.SubElement(et_html, "head" )
etree.SubElement(et_html[0], "title").text = "oeasy"
etree.SubElement(et_html, "body").text = "o2z"
etree.SubElement(et_html[1], "h1").text = "o3z"- 构建出html这棵树
- 输出 这棵树
print(etree.tostring(et_html,pretty_print=True).decode())
- 可以生成etree
et_html.
- 通过按下tab做提示
- iter() 看起来 很像 遍历函数
- 用 iter()函数 遍历 整棵树
for element in et_html.iter():
print(element.tag,element.text)
- 找到了
- head下的 title
- body下的 h1
- iter()函数 返回的容器
- 是
什么类型 呢?
- 是
- 输出看看
print(html.iter())
- 这个东西的类型是
- Element Depth First Iterator
- 元素 深度优先 迭代器
- 什么是 深度优先 ?
- 见到 节点
- 先往
深里走 - 而不是 先往
广里走
- 先往
- 遍历head之后
- 往深里走
- 找到title
- 往深里走
- 这就是深度优先
- DepthFirst
- 和深度优先相对的
- 是广度优先
- 找到 head 之后
- 先 往广里走
- 找到 body
- 想要 试试
广度优先遍历- 可以 吗?
深度优先是- 嫡长子 - 娣长孙
- 一枝捋到底
广度优先是- 先找 最近的弟弟
- 这一辈 都捋完了
- 再往下 找下一辈儿
- 子侄辈
- 都捋完了
- 再去
- 捋孙子 辈
- 先找 最近的弟弟
- 流程
- 先 输出 当前节点
- 然后 把当前节点的 所有的子节点
- 比如 head、body
- 都放到 列表里
- 之后
- 对于 列表中的 每个节点
- 删除 当前节点
- 最后 遍历 当前节点
- 这就是
广度优先- Breadth-First-Search
l = []
def traversal(et):
print(et.tag,et.text,sep=":")
for ele in et:
l.append(ele)
for ele in l:
l.remove(ele)
traversal(ele)
traversal(et_html)- 而 traversal()使用的方式 是
- 深度优先 遍历节点
- Depth First
- 遍历 和 迭代有什么区别吗?
- 迭代(iterate)
- 按照某种顺序
- 逐个访问
- 列表中的每一项
for element in et_html.iter():
print(element.tag,element.text)- 遍历(traversal)
- 指的是按照一定的规则访问树形结构中的每个节点
- 而且每个节点都只访问一次
def traversal(et):
print(et.tag,et.text,sep=":")
for ele in et:
l.append(ele)
for ele in l:
l.remove(ele)
iterator(ele)| 对比项 | 迭代(Iteration) | 遍历(Traversal) |
|---|---|---|
| 英文 | Iteration | Traversal |
| 含义 | 一步一步取东西 | 把所有东西都看一遍 |
| 重点 | 强调动作/过程 | 强调目标/结果 |
| 一定要看完吗 | 不用,可以取一半 | 必须全部看完、不漏 |
| 关系 | 是实现遍历的方法 | 靠迭代来完成 |
- 最精简一句话
迭代是一步步取,遍历是全看完。
- 迭代器 iter()可以
- 能
筛选元素 吗?
- 能
- 先查文档
root.iter("child")
#可以遍历root下 所有标签是child的 子元素
root.iter("child","another")
#筛选这两个 tag 的所有元素
- 遍历 这
两个 元素
- 尝试 筛选出head元素
for element in et_html.iter("head"):
print(element.tag, element.text,sep=":")- 真把 head 筛出来了
- 可以筛出
多个标签吗?
for element in et_html.iter("head","h1"):
print(element.tag, element.text,sep=":")- 两个
都筛出来了- 这其实 是 筛选出
- head头
- 所有 标题一级别的文本
- 这其实 是 筛选出
- 除了 tag 和 text
- 可以将 tails 也输出出来吗?
et_html[1][0].tail = "o4z"
for element in et_html.iter("head","h1"):
print(element.tag,element.text,element.tail)
- 结果
- 树 具体 长成
啥样 来着?
print(etree.tostring(et_html,pretty_print=True).decode())
- 树形结构
-
这次了解了
- 深度优先遍历函数
- iter()
-
iter()
- 是迭代器函数
- 可以
筛元素 - 深度优先遍历
怎么把etree上的文本都输出来着?🤔
- 下次再说👋
- 本文来自 oeasy Python 系统教程。
- 想完整、扎实学 Python,
- 搜索 oeasy 即可。














