Error in user YAML: (<unknown>): found a tab character that violate indentation while scanning a plain scalar at line 3 column 3
---
- oeasy Python 0526
- 这是 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`
---- 方法
| 函数名 | 功能 |
|---|---|
| append | 添加子节点 |
| remove | 移除子节点 |
| insert | 指定位置添加 |
-
etree里面元素的访问方法
- 索引 index
- 切片 slice
-
可以根据节点
- 找到 他的
父亲、孩子、哥哥、弟弟吗?
- 找到 他的
- 复现 上次代码
from lxml import etree
et_html = etree.Element("html")
et_head = etree.Element("head")
et_body = etree.Element("body")
et_ul = etree.Element("ul")
et_html.append(et_head)
et_html.append(et_body)
et_body.append(et_ul)
for num in range(3):
et_li = etree.Element("li")
et_ul.append(et_li)
- 可以用 方法
- 得到 节点的 哥哥或弟弟 节点
- 可以 得到
- 父级或者子级 节点 吗?
- 得到父级
et_body.getparent()
- body的 父亲 是 html
- html 的孩子有谁呢?
et_html.getchildren()
- 子集 得到
- 伦理清晰
- 准备验证
- 综合验证
print(et_body.getparent())
print(et_html.getchildren())
print(et_body.getprevious())
print(et_head.getnext())
- 得到
- body父亲html
- html孩子[head, body]
- body哥哥head
- head弟弟body
print(etree.tostring(et_html,pretty_print=True).decode())
- 目前 层级间 缩进两格
- 可以 把缩进 改为4空格吗?
- 根据文档
- 再次输出
etree.indent(et_html, space = " ")
print(etree.tostring(et_html,pretty_print=True).decode())
- 效果
- 这棵dom树 架子有了
- 但却是 空架子
- 没有文本啊!
- 如何 在etree节点上 挂
文本呢??🤔
- text(文本)是
- etree元素 的 成员属性
- 就像 标签(tag) 一样
- text 成员的类型是
- 字符串
from lxml import etree
et_html = etree.Element("html")
et_head = etree.Element("head")
et_html.append(et_head)
et_title = etree.Element("title")
et_head.append(et_title)
et_body = etree.Element("body")
et_html.append(et_body)
print(etree.tostring(et_html,pretty_print=True).decode())
- 这里出现的四个元素
- 都没有text成员
- 给title添加
- text成员
- 添加第9句后
- 再输出
et_title.text = "oeasy"
print(etree.tostring(et_html,pretty_print=True).decode())- 可以看到设置了 title中的 文本(text)
- 网页有了标题
- 可以 让body
也有text吗?
et_body.text = "oeasy"
print(etree.tostring(et_html,pretty_print=True).decode())- 运行结果
- 元素树(element tree)
- 可以 生成得 更快些 吗?
- etree.Element函数
- 作用是构建etree的Element
- etree.SubElement函数
- 不但 构建etree的Element
- 并且 把新建的Element 添加到目标元素下
- 也就是说
- 新元素 是 目标元素的子元素
- 构造节点 连带 父子关系
- 一行搞定
- 按照新思路 改造源码
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"
print(etree.tostring(et_html,pretty_print=True).decode())
for element in et_html:
print(element.tag,element.text)
- 和原来的代码等效
- 除了 text 成员
还有啥 也代表着- 网页中的 文本 呢?
- 可以在元素后面
- 追加尾部文本
- tail
- tail 是什么意思呢?
- tail就是尾巴
- 具体怎么用呢?
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"
et_html[1][0].tail = "o4z"
print(etree.tostring(et_html,pretty_print=True).decode())
for element in et_html:
print(element.tag,element.text)
- body中的文本只有o2z吗?
- 为什么body中的文本
- 只有o2z?
- tail 像 text
- 是 元素的成员变量
- 也是 字符串类型的
- 只不过在元素结束标签的后面
- 怎么 把body中的文本
都提取出来呢?
- 好像可以试试
- etree.tostring(et_body, 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"
et_html[1][0].tail = "o4z"
print(etree.tostring(et_html[1],pretty_print=True).decode())
print(etree.tostring(et_html[1], method="text").decode())
- 确实可以
- 把 标签都去除
- 筛出 纯文本 来
- 但是 单词 都 粘在一起
- 分不开了
- 怎么办呢?
- 了解 树中的 元素关系
| 函数 | 作用 |
|---|---|
| getparent | 得到 父级 |
| getchildren | 得到 子集列表 |
| getprevious | 得到 哥哥 |
| getnext | 得到 弟弟 |
- 了解 etree 中的元素的成员变量
| text | tail | tag | attrib | |
|---|---|---|---|---|
| 含义 | 文本 | 尾部文本 | 标签 | 属性 |
| 类型 | 字符串 | 字符串 | 字符串 | 字典 |
- etree.tostring() 函数参数
- method = "text"
- 可以控制输出结果只包含 text 和 tail
- pretty_print = True
- 可以控制输出结果包含缩进信息
- method = "text"
- 想要把 节点下面
- 所有的节点 的文本
- 和 节点下 所有的子节点 文本
- 都找出来
- 要
怎么办 呢?🤔 - 下次再说👋
- 本文来自 oeasy Python 系统教程。
- 想完整、扎实学 Python,
- 搜索 oeasy 即可。























