Skip to content

Latest commit

 

History

History
327 lines (219 loc) · 5.74 KB

File metadata and controls

327 lines (219 loc) · 5.74 KB
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` 
---

语法 html 生成

回忆

  • 上次 了解了 编码设置
    • 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元素 高亮显示

复制xpath

  • 右键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的属性

图片描述

  • 还能找谁?
  • 继续往下找!

p元素

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