Error in user YAML: (<unknown>): could not find expected ':' while scanning a simple key at line 3 column 1
---
- oeasy Python 0533
- 这是 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`
---- 上次 了解了 编码设置
- response 获得 网页 的 字节流之后
- 可按照指定的编码格式解码
| 编码名称 | 应用领域 |
|---|---|
| UTF-8 | 使用最广泛 |
| ASCII | 英语 |
| ISO-8859-1 | 拉丁字母 |
| GBK | 简繁体中文 |
| BIG5 | 繁体中文 |
- etree 可以顺利生成了
- 如何 快速 定位 要爬取的节点呢??🤔
- 问问ai
- 什么是
xpath呢?
- xpath
- 这xpath怎么理解呢?
- 启动 本地Web服务
sudo service nginx start
sudo service nginx status
firefox http://localhost &
- 浏览网页
- 选中标题 右键
- 检查元素
- 鼠标放到 查看器的
- h1 元素上之后
- 网页中的h1元素 高亮显示
- 右键h1元素
- 复制 xpath
- 把xpath粘贴到地址栏
- 这怎么理解?
- dom 树如下
- 根下的html
- 下面的body
- 下面的h1
/html/body/h1
import requests
from lxml import etree
response = requests.get("http://localhost")
b_html = response.content
et_html = etree.HTML(b_html)
nodelist = et_html.xpath("/html/body/h1")
print(nodelist)
- 得到 h1元素 列表
type(nodelist)
- 确认类型
- 确实是列表
nodelist[0]
nodelist[0].tag
nodelist[0].text
- 可以得到h1的属性
- 还能找谁?
- 继续往下找!
nodelist = et_html.xpath("/html/body/p")
nodelist
- 获得了 找到3个p元素
- 都在同一个列表
- 目前 使用的是
绝对路径- 可以 使用
相对路径表示 这3个p 吗?
- 可以 使用
- 当前节点 html 是 根节点
nodelist = et_html.xpath("body/p")
nodelist
- body是 当前节点html 的 直接子节点
- 可以找到 这三个元素
- 绝对路径
- /html/body/p
- 相对路径
- body/p
- 可以 再往
更~深了找 吗?
| xpath | 描述方式 |
|---|---|
| body/p/a | 当前节点下的 body下的 p下的 a元素 |
| /html/body/p/a | 根下的html下的 body下的 p下的 a元素 |
| /html/body/p[2]/a | 根下的html下的 body下的 第2个p下的 a元素 |
- 上述的xpath等价
nodelist = et_html.xpath("body/p/a")
nodelist
- 因为所有a
都在 第二个p里
- 想
直接找到- 所有 a元素 的 列表
- 找到任意层级下的 a元素
nodelist = et_html.xpath("//a")
nodelist
- 从 树的 层级 来说
- 本节点下 是
/ - 任意层级下 是
//
- 本节点下 是
- 再找个 任意层级下的
- //em
- 任意层级下的em元素
nodelist = et_html.xpath("//em")
nodelist
- 可以找到
- 本节点下 是
/- 任意层级下 是
//
- 任意层级下 是
- 可以 往
上找吗?
- 先进body
- 再退回 html
- 再进head
- 向上一层
- 两个点(..)
nodelist = et_html.xpath("/html/body/../head/style")
nodelist
- 根下的html下的
- body的
- 上一层元素(html)下的
- head下的
- style元素
- 一个点 (
.) 怎么说 ?
- xpath(".")
- 得到的 是
- 当前元素的列表
nodelist = et_html.xpath(".")
nodelist
- 当前节点为 根节点 html
当前节点- 点(.)
- body的当前节点
- (还是body)下的
- h1元素
nodelist = et_html.xpath("body/./h1")
nodelist
/是当前节点下.是 当前节点
- 这次深入了 xpath
- xpath
- 用来筛选
- xml 文件中的节点
| 表达式 | 描述 |
|---|---|
| nodename | 在当前位置选择此类节点 |
| / | 从根节点选取 或 表示层级关系 |
| // | 在任意层级下的子孙路径下 |
| . | 选取当前节点 |
| .. | 选取当前节点的父节点 |
- xpath 还有什么可以玩的呢?🤔
- 下次再说👋
- 本文来自 oeasy Python 系统教程。
- 想完整、扎实学 Python,
- 搜索 oeasy 即可。
























