Skip to content

Latest commit

 

History

History
237 lines (161 loc) · 4.39 KB

File metadata and controls

237 lines (161 loc) · 4.39 KB
Error in user YAML: (<unknown>): could not find expected ':' while scanning a simple key at line 3 column 1
---
- oeasy Python 0531
- 这是 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 生成 etree

回忆

  • 终于可以通过字符串
    • 构建一棵 etree 的节点树了
    • 通过 etree.HTML()函数
    • 将网页源文件进行 parse(语法分析)生成一棵 etree

图片描述

  • 要总装了
    • 把一切串联起来
    • 将request 得到的 response.content
    • 当做 etree.HTML()需要的参数
  • 想 把爬到的字节序列
    • 生成 节点树?🤔
  • 可能吗?🤔

准备环境

  • 启动 nginx
sudo service nginx start
sudo service nginx status
firefox http://localhost &
  • 浏览器中 确认
    • 已经在 localhost 启动web服务

图片描述

  • 先去 游乐场
    • 试试 用python 发请求 接响应

游乐场试水

import requests
response = requests.get("http://localhost")
response.status_code
  • 状态码 为 200

图片描述

  • 可以 得到源文件 吗?

得到源文件

response.text
response.content
  • 两种形式的 响应
    1. text 字符串
    2. content 字节序列

图片描述

  • 可以 用响应 生成元素树 吗?

生成元素树

from lxml import etree
b_html = response.content
et_html = etree.HTML(b_html)
print(etree.tostring(et_html,pretty_print=True).decode())
  • 用字节序列形式的
    • response.content
    • 确实可以生成元素树

图片描述

  • 好像没有 缩进(indent)

控制缩进

  • 设置 缩进(indent)
etree.indent(et_html, "    ")
print(etree.tostring(et_html,pretty_print=True).decode())
  • 缩进成功

图片描述

  • 可以 遍历 这棵 etree吗?

遍历元素树

for element in et_html.iter():
	print(element.tag, element.text)
  • 确实可以遍历整棵树

图片描述

  • 我可以 输出 body元素 对应的分支吗?

遍历body

  • body元素是
    • html 的 第1个子节点
    • et_html[1]
print(etree.tostring(et_html[1],pretty_print=True).decode())
  • 只输出body

图片描述

  • 遍历body子节点

遍历

for element in et_html[1].iter():
	print(element.tag, element.text)
  • 遍历body下 所有子节点

图片描述

  • 如果我想 筛出
    • body中的 a元素 呢?

筛选

for element in et_html[1].iter("a"):
	print(element.tag, element.text)
  • 遍历的时候 对a元素 进行筛选

图片描述

  • 筛选出
    • 所有a元素
    • 及其文本

网页中查看

图片描述

  • 观察源码

图片描述

  • 我 还想看看
    • a.attrib

修改结果

for element in et_html[1].iter("a"):
    print(element.tag)
    print(element.text)
    print(element.attrib)
    print("================")
  • 最终结果

图片描述

  • 想在字典中
    • 根据key找到value

字典索引

for element in et_html[1].iter("a"):
    print(element.tag)
    print(element.text)
    print(element.attrib)
    print(element.attrib["href"])
    print("================")
  • 输出结果

图片描述

观察源码

  • 确实对应上源码中的超链接

图片描述

总结

  • 上次 将 字符串
    • 转化为 etree节点
  • 这次
    • 发送requests
    • 返回的response
  • 将 response 作为 源头
    • 生成etree节点

图片描述

  • 但是 如果 网页文件 的 编码格式
    • 不是utf-8
    • 而是gb2312呢??🤔
  • 下次再说 👋

  • 本文来自 oeasy Python 系统教程。
  • 想完整、扎实学 Python,
  • 搜索 oeasy 即可。