Error in user YAML: (<unknown>): found a tab character that violate indentation while scanning a plain scalar at line 3 column 3
---
- oeasy Python 0535
- 这是 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 表达式 | 含义 |
|---|---|
| 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属性是特定值的 最后一个 元素 |
| //@ | 任意层级下 任意属性 |
- 首先在用户宿主文件夹
- 建立一个网页
vi food.html- 网页文件如下
<!DOCTYPE html>
<html lang="zh-cn">
<head>
<title>menu</title>
<meta charset="utf-8">
</head>
<body width="700px">
<h1>menu</h1>
<ul id="ulist">
<li>
<span class="food">豆汁</span>
<price>10</price>
</li>
<li>
<span class="food">羊瘪汤</span>
<price>15</price>
</li>
<li>
<span class="food">折耳根</span>
<price>20</price>
</li>
</ul>
</body>
</html>- "+P粘贴
- 然后保存并退出
whereis nginx
sudo cp food.html /usr/share/nginx/html
sudo service nginx start
firefox http://localhost/food.html &
- 将网页文件拷贝至web服务器根下
- 并启动web服务
- 用火狐访问到网页
- 总共3个li
import requests
from lxml import etree
response = requests.get("http://localhost/food.html")
b_html = response.content
et_html = etree.HTML(b_html)
nl = et_html.xpath("//li")
for ele in nl:
print(ele)- 访问任意层级下的
- li元素
- 访问成功
- 试试通配符
- 具体怎么用呢?
nl = et_html.xpath("*")
for ele in nl:
print(ele)
- xpath("*")
- 匹配当前节点(html)下的
- 直接子节点
- 共两个
- head
- body
- 要选出
- 所有的 元素节点
- 应该如何呢?
nl = et_html.xpath("//*")
for ele in nl:
print(ele)- xpath("//*")
- 匹配任意层级下的
- 任意节点
- 而且是深度优先的
- 如果我要筛选出
- 所有有属性的
- 元素节点呢?
- 尝试使用
- 谓词
- predicates
- 结果
- 取决于
- predicated on
- xpath expression
- xpath("//*[@*]")
- 匹配任意层级下的
- 全部有属性的节点
nl = et_html.xpath("//*[@*]")
for ele in nl:
print(ele)- 数量有减少
- 可以看看具体属性的情况吗?
nl = et_html.xpath("//*[@*]")
for ele in nl:
print(ele.tag, ele.attrib)- 查询结果
- et_target = et_html.xpath("//h1|//price")
- 符合前面//h1 或者符合后面//price 都可以
nl = et_html.xpath("//li|//price")
for ele in nl:
print(ele)- 实现结果
- xpath 的用法
- 我们 基本了解了
- 这xpath 怎么来的 呢?
- 为什么会有 xpath?
- 早年间文本
- 没有统一的 交换格式
- 为了交流的方便
- 国际标准化组织 iso 制定了
- SGML标准
- Standard Generalized Markup Language
- 标准 通用 标记 语言
- 是国际上 定义电子文件结构 和 内容描述的标准
- 主要用于
- 工业领域 数据交换
- 大量高度结构化 的 数据访问
<!SGML "ISO 8879:1986" CHARSET=UTF-8 CAPACITY=1000>
<!DOCTYPE book [
!ELEMENT book - - (title, author+, chapter+)>
!ELEMENT title - - (#PCDATA)>
!ELEMENT author - - (#PCDATA)>
!ATTLIST author email CDATA #REQUIRED>
!ELEMENT chapter - - (sect1+)>
!ELEMENT sect1 - - (sect2? | para+)>
!ELEMENT sect2 - - (para+)>
!ELEMENT para - - (#PCDATA)>
!ENTITY copy "©">
!ENTITY chap1 "第一章 引言">
]>
<book>
<title>SGML 入门教程 © 2026</title>
<author email="author@example.com">张三</author>
<chapter>
<sect1>
<title>&chap1;</title>
<para>SGML 是标准通用标记语言,用于定义结构化文档。</para>
</sect1>
</chapter>
</book>
- 在 分类和索引数据中
- 非常有用
- SGML 是
- 给文本 添加标签
- 标签本身 也成了
- 文档的 一部分
- 后来 读写文件 的标准
- 开始 基于
- 互联网 浏览器
- 一种 新的 标签标准
- 在 web实践中 诞生
- 在 各种web工具的 试探实践中
- HTML 这种超文本语言 出现了
- 1989 年
- HTML 诞生
- Tim Berners-Lee
- 最先在自己的 next 机器上
- 建立了这种语言
- HTML 抛弃了 SGML 复杂庞大的缺点
- 继承了 SGML 的很多优点
- HTML 最大的特点是简单性和跨平台性
- HTML 诞生
- 同时 出现了
- 基于html浏览器
- 浏览器的作用
- 就是 将html语言
- 渲染成页面形式
- 浏览器各种兼容和试新的过程中进化
- 今天
- 我们看的网页都是
- html
-
html
- 目标是 网页渲染
- 而不基于
- 数据本身 的
- 类型 和 结构
-
随着 数据量的发展
- html可读性差、搜索时间长
- 1998 年 2 月 10 日
- W3C(World Wide Web Consortium,万维网联盟)
- 公布 XML 1.0 标准
- 描述数据类型和结构
- XML 诞生了
- xml 描述的 是纯粹的数据
- 但如何 将xml渲染成
- 易读的页面呢?
- 为了让 xml 看起来更好看
- XSLT 规范出现
- 代替css
- 渲染xml的规范
- XSLT 对于 xml
- 就像 css 对于 html
- xml、html
- 楼房结构
- 是语义
- xslt、css
- 是楼房的
- 装修风格
- 是外观
- 除此之外
- 还有对于xml的筛选工具
- 其中的 xpath 是
- 关于 xml 元素筛选的标准
xpath的意思- 就是
xmlpathlanguage
- 就是
- xml(e
XtensibleMarkupLanguage)- 是为了解决html标签
- 太过面向渲染
- 而不面向数据而产生的
- 是html的升级
- 本质上也是一种特殊的SGML
- xslt(E
xtensibleStylesheetLanguageTransformations)- 是为了解决xml呈现能力差
- 而产生的
- 是css的升级
- 本质上也是
- 一种特殊的SGML
- 说到底
- 又 回到了
最初SGML StandardGeneralizedMarkupLanguage
- 又 回到了
- 虽说 回到了
最初- 但 这个
最初 - 已经 不是1986年
- 那个 纸质的
最初了
- 但 这个
- 纸张消失了
- 浏览 要靠 网页
- 就连1986年的纸质文档
- 也数字化了
- 最初之前的
更初呢
- sgml来自于gml
- generic markup language
- gml是一种文档格式的脚本
- gml是ibm用来描述文档标题格式用的
- 定义了
- 段落
- 标题
- 列表
- 表格等
- 是为了 当时 渲染设备
- 针式打字机 服务的 一种语言
- gml还可以往前倒么?
- markup language
- markup 其实就是 make up
- 起源就是用笔做笔记或者标记
- 这是标签做标记的起点
- 此后一路发展
- ml标记方式的可能性很多
- 所以要一种通用的generic
- gml
- gml需要规范化
- 所以需要standard
- 这就是sgml
- xpath 是
- 整个爬取的 核心
| 名称 | 出现时间 | 制定者/来源 | 核心定位 | 特点 |
|---|---|---|---|---|
| ML(Markup Language) | 1960s 前后 | 排版行业自发 | 通用标记概念 | 用标记控制排版/格式;无统一标准,侧重实用 |
| GML | 1969年 | IBM(Goldfarb等) | 结构化文档标记基础 | 内容与格式分离;可自定义标记;无固定标签 |
| SGML | 1986年 | ISO(国际标准化组织) | 标记语言通用规则(元语言) | 可定制、带DTD校验;适配多场景,兼容性强 |
| HTML | 1991年 | Tim Berners-Lee(CERN) | 网页展示类标记语言 | 固定标签;侧重展示效果;语法宽松 |
| XML | 1998年 | W3C | 数据交换专用标记 | 精简无冗余;易解析;适配多系统数据交互 |
- markup language
- 来自于language
- 语言和劳动创造了人本身
- 去做点练习吧!🤔
- 下次再说
- 本文来自 oeasy Python 系统教程。
- 想完整、扎实学 Python,
- 搜索 oeasy 即可。



























