Error in user YAML: (<unknown>): could not find expected ':' while scanning a simple key at line 3 column 1
---
- oeasy Python 0534
- 这是 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`
---- 上次深入了 xpath
- xpath
- 用来筛选
- xml 文件中的节点
| 表达式 | 描述 |
|---|---|
| nodename | 在当前位置选择此类节点 |
| / | 从根节点选取 或 表示层级关系 |
| // | 在任意层级下的子孙路径下 |
| . | 选取当前节点 |
| .. | 选取当前节点的父节点 |
- xpath 还有什么可以玩的呢?🤔
- 启动 本地Web服务
sudo service nginx start
sudo service nginx status
firefox http://localhost &
- 浏览器
- 右键内容检查元素
- 在 元素查看界面
- 右键复制 - xpath
- 元素的xpath
- 已经 复制到了 剪贴板
- 在游乐场运行
import requests
from lxml import etree
response = requests.get("http://localhost")
b_html = response.content
et_html = etree.HTML(b_html)
nl = et_html.xpath("/html/body/p[1]")
print(nl)
- /html/body/p[1]
- /html
- 根下的html下
- /body
- html下的body下
- /p[1]
- body 下的 第1个 p 元素
- /html
- 到底是 哪个段落(Paragraph)呢?
- 查看文本
nl[0].text
- 确认是 第一段
-
注意!!!
- 元素树节点下标
- 是从1开始
- 与列表
- 从0开始
不同
- 元素树节点下标
-
这里 用到的 中括号
- 叫什么 方法 呢?
- 谓词 predicates
- 如何理解谓词呢?
- 谓词
- 是 对元素 进一步的描述
- 是 筛选元素的 方式
- 中括号叫做谓词
- 根据属性值筛选
-
- 代表任意元素
nl = et_html.xpath("//*")
for element in nl:
print(element)- // 代表 任意层级
- * 代表 任意元素
- //* 代表 任意层级下的 任意元素
- 深度优先 遍历 所有元素
- 想筛选 所有 有属性的元素
nl = et_html.xpath("//*[@*]")
for element in nl:
print(element)- 只有a元素 有属性href
- 想按照位置筛选
- nodelist
- 这是 元素树节点的列表
- list of element tree
nl = et_html.xpath("//a")
for element in nl:
print(element)- 任意层级下的
- a元素
- 找到
- 2个a元素
nl = et_html.xpath("//a[@*]")
for element in nl:
print(element)- //a[@*]
- //a
- 任意层级下的
- a元素
- [@*]
- []是筛选谓词
- @是attribute
- *是任意的
- 有任意属性的
- //a
- 想要 任意层级下
- 有任意属性的
- 任意元素
- //a[@href]
- //a
- 任意层级下的
- a元素
- [@href]
- 有@href属性的
- //a
nl = et_html.xpath("//a[@href]")
for element in nl:
print(element)- 任意路径下
- 有href属性的
- a元素
- 想把其中一个a筛出来
- 原来是根据属性谓词
- 筛选 元素
- //a[@href="http://nginx.org"]
- 任意层级下
- 有href属性
- 且值为 "http://nginx.org/" 的
- a元素
nl = et_html.xpath("//a[@href=\"http://nginx.org/\"]")
for element in nl:
print(element)- 注意 属性值 引用
- 单引号或者双引号都可以
- 冲突了的话 需要转义
- 像筛选 所有 有属性的a元素
- 任意层级下的
- 位置小于2的
- 有href的a元素
nl = et_html.xpath("//a[1]")
for element in nl:
print(element)- 以下xpath等价
| 表达式 | 描述 |
|---|---|
| //a[1] | 任意层级下 第一个 a元素 |
| //a[postion()=1] | 任意层级下 位置等于1的 a元素 |
| //a[postion()<2] | 任意层级下 位置小于2的 a元素 |
- xpath 可以
- 成功得到元素列表
- 但是
- 可以得到 元素的属性 吗?
et_html.
- 到游乐场找找
- attrib 就是属性
- 具体什么类型呢?
et_html
et_html.attrib
- 类型 是 字典
- 尝试遍历
- "//a"
- // 任意层级下的
nl = et_html.xpath("//a")
for ele in nl:
print(ele.tag)
print(ele.attrib)
- 找到 任意层级下
- 所有 有属性的元素
- 打印他的属性字典
- 想要把超链接 都列出
nl = et_html.xpath("//a")
for ele in nl:
print(ele.tag)
print(ele.attrib["href"])
- 可以用href
- 索引到超链接
- 我们再温习一下下
- 这里面出现了中括号[ ]
- 找一下/html/body下
- 第 1 个 p
- /html/body/
- 最后一个p元素
- 在索引运算符中使用了 last()
- 此时last() = 3
- 倒数第二个p
- 关键还是对 li 使用索引运算符
- last()是最后一个
- last() - 1 是倒数第二个
- 前两个p
- p[position()<3]
- 可以找到前两项
- 如果我想找后两项呢?🤔
- p[position()>last()-2]
- 可以找到后两项
- 任意层级下href属性 的 a元素 🤪
- 可以试试href属性是特定值吗?
- href属性是 http://nginx.org 的a元素
- 这次深入了 xpath 的筛选
- 可以用中括号索引的方式对于子元素的位置进行筛选
| xpath 表达式 | 含义 |
|---|---|
| xpath("//p[1]") | 第一个p |
| xpath("//p[last()]") | 最后一个p |
| xpath("//p[position()<=3]") | 正数前三个p |
| xpath("//p[position()>last()-2"]) | 倒数两个p |
- 可以在索引中对属性进行筛选
- @ 俗称花 a
- 对应@ttribute
| xpath 表达式 | 含义 |
|---|---|
| //*[@href] | 任意层级下 有href属性的 元素 |
| //*[@href=\"http://nginx.org/"] | 任意层级下 href属性是特定值的 元素 |
| //a[last()][@href=\"http://nginx.org/"] | 任意层级下 href属性是特定值的 最后一个 元素 |
| //@ | 任意层级下 任意属性 |
- 还有什么好玩的呢?🤔
- 下次再说
- 本文来自 oeasy Python 系统教程。
- 想完整、扎实学 Python,
- 搜索 oeasy 即可。



























