XPath
XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力。
描述 | |
---|---|
树 | 整个html(xml)代码结构就是一个树结构 |
节点 | 树结构中的每一个元素(标签)就是一个节点 |
根节点(根元素) | html或者xml最外面的那个标签(元素) |
节点内容 | 标签内容 |
节点属性 | 标签属性 |
描述 | |
---|---|
nodename | 选取此节点的所有子节点 |
/ | 从根节点选取 |
// | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置 |
. | 选取当前节点 |
. . | 选取当前节点的父节点 |
@ | 选取属性 |
描述 | |
---|---|
绝对路径 | 用"/"开头的路径 - /标签在树结构中的路径 (路径必须从根节点开始写) |
相对路径 | 路径开头用"."标签当前节点(xpath前面是谁,'.'就代表谁), "…"表示当前节点的上层节点 |
全(任意)路径 | 用"//"开头的路径 - 在整个树中获取标签 |
语法:
1. 创建树结构获取树的根节点
etree.XML(xml数据)
etree.HTML(html数据)
2. 根据xpath获取指定标签
节点对象.xpath(路径) - 返回路径对应的所有的标签,
返回值是列表,列表中的元素是标签对象(节点对象)
3. 获取标签内容
节点对象.xpath(获取标签的路径/text())
- 获取指定路径下所有标签的标签内容
4. 获取标签属性值
节点对象.xpath(获取标签的路径/@属性名)
5. 谓语(条件)
a. 位置相关谓语
"""
[N] - 第N个
[last()] - 最后一个
[last()-N] - 倒数第 N + 1 个
[position()>N]、[position()>=N] - 第 N 个后面的所有、(包含 N)
"""
b.属性相关谓语
"""
[@属性名=属性值] - 指定属性是指定值的标签
[@属性名] - 拥有指定属性的标签
"""
c.子标签内容相关谓语 - 根据子标签的内容来筛选标签
"""
[子标签名>数据]
"""
6. 通配符
* - 表示所有标签或者所有属性
7. 若干路径(|)
路径1|路径2 - 同时获取路径1和路径2的内容
多线程
多线程(multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。
1. 基本理论
1)进程和线程
进程: 一个正在运行的应用程序就是一个进程,每个进程均运行在其专门且受保护的内存空间中
线程: 线程是进程执行任务的基本单元(一个进程中的任务都是在线程中执行的)
一个进程中默认有一个线程,这个线程叫主线程。
2)线程的特点
如果在一个线程中执行多个任务,任务是串行执行的。
(当一个程序中有很多个任务的时候,如果只有一个线程,那么程序的执行效率会很低)
3)多线程
一个进程中有多个线程就是多线程。
多线程执行任务的时候,多个任务可以同时(并行)执行。
4)多线程原理
一个cpu同一时间只能调度一个线程,多线程其实是cpu快速的在多个线程之间进行切换,造成多个线程同时执行的假象。
(提高cpu利用率)
2. Python使用多线程的方法
1)Python程序中如果需要子线程,必须创建线程类(Thread)的对象。
线程对象 = Thread(target=函数, args=元组)
a.函数 - 可以是普通函数函数名,也可以是匿名函数。这个函数就是需要子线程中执行的任务。
b.元组 - 元组中的元素就是在子线程中调用target对应的函数的时候需要的参数
2)启动线程 - 让子线程调用对应的函数
线程对象.start()
from threading import Thread
from time import sleep
from datetime import datetime
def download(name):
print(f'{name}开始下载:{datetime.now()}')
sleep(2)
print(f'{name}下载结束:{datetime.now()}')
if __name__ == '__main__':
download('肖生克的救赎')
download('霸王别姬')
download('阿甘正传')
t1 = Thread(target=download, args=('肖生克救赎',))
t2 = Thread(target=download, args=('霸王别姬',))
t3 = Thread(target=download, args=('阿甘正传',))
t1.start()
t2.start()
t3.start()