show | version | enable_checker |
---|---|---|
step |
1.0 |
true |
- 首先 将 字符串
- 转化为 ElementTree对象
- 然后把前面的 requests的结果
- 和 etree生成 结合了
- 通过 requests
- 获得网页的 response
- 通过 HTML 函数
- 把 response 的字节序列
- 转化为一棵 etree 树
- 流程
- 跑通了
- 但是
- 找元素 挺麻烦
- 有什么 更好的方法吗?🤔
- 搜索xpath
- 点击第一个开始研究
- xpath
- 是 w3c制定的 标准
- 具体怎么用?
表达式 | 描述 |
---|---|
nodename | 在当前位置选择此类节点 |
/ | 从根节点选取 或 表示层级关系 |
// | 在任意层级下的子孙路径下 |
. | 选取当前节点 |
.. | 选取当前节点的父节点 |
@ | 选取属性 |
- 这些东西怎么理解呢?
- 具体来看看
sudo service nginx start
sudo service nginx status
firefox http://localhost &
- 右键
- 查看源代码
- view source
- dom 树如下
- 我们来试一下
- 各种路径表达式
- 点(.) 为当前节点
- et_为类型前缀
- 含义为element_tree_node
- 元素树节点
import requests
from lxml import etree
response = requests.get("http://localhost")
b_html = response.content
et_html = etree.HTML(b_html)
et_element = et_html.xpath(".")
print(et_element)
- xpath 参数为 .
- 选择的是 当前节点
- 输出为html元素的列表
- 结果 真的
- 是一个列表?
- 追加输出
- et_element的type
print(type(et_element))
- 复制最后一句
- 输出 et_element的type
- 确实 xpath函数的返回值类型
- 是一个列表
- list
- xpath(".")
- 得到的 是
- 当前元素html
- html下面
- 还有什么
- 子节点呢?
- 当前节点为html
- 下面有head子节点
- 可以输出head元素
- 可以 再往深了找 吗?
- body/p
- 使用的是相对路径
- 代表着 当前元素(et_html)
- 下面的body
- 下面的p
- 这使用的是相对路径
- 也可以使用 绝对路径
- /html/body/p
- 可以找到3个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等价
- 因为所有a
- 都在第二个p里面
- 都可以找到
- 所有 a元素 的 列表
- //em
- 任意层级下的em元素
- 可以找到
- 当前节点
- 点(.)
- body的当前节点
- (还是body)下的
- h1元素
- 向上一层
- 两个点(..)
- 根下的html下的
- body的
- 上一层元素(html)下的
- head下的
- style元素
- 我们怎么知道
- 需要的元素是 哪个子节点 呢?
- 右键内容检查元素
- 在元素查看界面
- 右键复制-xpath
- 将 该元素的xpath
- 复制到 剪贴板
- 将复制的xpath
- 粘贴到代码
- /html/body/p[1]
- /html
- 根下的html下
- /body
- html下的body下
- /p[1]
- body 下的 第1个 p 元素
- /html
- 注意!!!
- 元素树节点下标
- 是从1开始
- 与列表
- 从0开始
不
同
- 元素树节点下标
- 这次深入了 xpath
- xpath
- 用来筛选
- xml 文件中的节点
表达式 | 描述 |
---|---|
nodename | 在当前位置选择此类节点 |
/ | 从根节点选取 或 表示层级关系 |
// | 在任意层级下的子孙路径下 |
. | 选取当前节点 |
.. | 选取当前节点的父节点 |
@ | 选取属性 |
- @选属性 这个
- 我们还没有试
- 怎么用呢?🤔
- 下次再说👋