Skip to content

Latest commit

 

History

History
505 lines (373 loc) · 10.5 KB

File metadata and controls

505 lines (373 loc) · 10.5 KB
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 表达式 含义
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粘贴
  • 然后保存并退出

启动web服务器

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 的源头

  • 为什么会有 xpath?

图片描述

  • 早年间文本
    • 没有统一的 交换格式
    • 为了交流的方便
  • 国际标准化组织 iso 制定了
    • SGML标准

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 入门教程 &copy; 2026</title>
  <author email="author@example.com">张三</author>
  <chapter>
    <sect1>
      <title>&chap1;</title>
      <para>SGML 是标准通用标记语言,用于定义结构化文档。</para>
    </sect1>
  </chapter>
</book>

  • 在 分类和索引数据中
    • 非常有用

SGML

  • SGML 是
    • 给文本 添加标签
    • 标签本身 也成了
    • 文档的 一部分

图片描述

  • 后来 读写文件 的标准
    • 开始 基于
    • 互联网 浏览器
  • 一种 新的 标签标准
    • 在 web实践中 诞生

html

  • 在 各种web工具的 试探实践中
    • HTML 这种超文本语言 出现了
  • 1989 年
    • HTML 诞生
      • Tim Berners-Lee
      • 最先在自己的 next 机器上
      • 建立了这种语言
    • HTML 抛弃了 SGML 复杂庞大的缺点
      • 继承了 SGML 的很多优点
      • HTML 最大的特点是简单性和跨平台性

图片描述

  • 同时 出现了
    • 基于html浏览器
  • 浏览器的作用
    • 就是 将html语言
    • 渲染成页面形式
  • 浏览器各种兼容和试新的过程中进化

目前状态

  • 今天
    • 我们看的网页都是
    • html

图片描述

  • html

    • 目标是 网页渲染
    • 而不基于
      • 数据本身 的
      • 类型 和 结构
  • 随着 数据量的发展

    • html可读性差、搜索时间长

xml

  • 1998 年 2 月 10 日
    • W3C(World Wide Web Consortium,万维网联盟)
    • 公布 XML 1.0 标准
    • 描述数据类型和结构

图片描述

  • XML 诞生了
    • xml 描述的 是纯粹的数据
    • 但如何 将xml渲染成
    • 易读的页面呢?

xslt

  • 为了让 xml 看起来更好看
    • XSLT 规范出现
    • 代替css
    • 渲染xml的规范

图片描述

  • XSLT 对于 xml
    • 就像 css 对于 html

结构

图片描述

  • xml、html
    • 楼房结构
    • 是语义
  • xslt、css
    • 是楼房的
    • 装修风格
    • 是外观

图片描述

  • 除此之外
    • 还有对于xml的筛选工具

xpath

  • 其中的 xpath 是
    • 关于 xml 元素筛选的标准

图片描述

图片描述

  • xpath 的意思
    • 就是 xml path language

回到历史

  • xml(eXtensible Markup Language)
    • 是为了解决html标签
    • 太过面向渲染
    • 而不面向数据而产生的
    • 是html的升级
    • 本质上也是一种特殊的SGML
  • xslt(Extensible Stylesheet Language Transformations)
    • 是为了解决xml呈现能力差
    • 而产生的
    • 是css的升级
    • 本质上也是
    • 一种特殊的SGML
  • 说到底
    • 又 回到了 最初 SGML
    • Standard Generalized Markup Language

图片描述

  • 虽说 回到了 最初
    • 但 这个最初
    • 已经 不是1986年
    • 那个 纸质的最初
  • 纸张消失了
    • 浏览 要靠 网页

吞噬

  • 就连1986年的纸质文档
    • 也数字化了

图片描述

  • 最初之前的
    • 初呢

更初

  • sgml来自于gml
    • generic markup language

图片描述

  • gml是一种文档格式的脚本
    • gml是ibm用来描述文档标题格式用的
    • 定义了
      • 段落
      • 标题
      • 列表
      • 表格等

图片描述

  • 是为了 当时 渲染设备
    • 针式打字机 服务的 一种语言
  • gml还可以往前倒么?

ml

  • 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 即可。