xpath基础和多线程基础

xpath语法

from lxml import etree

xpath基本概念

“”"
树结构:整个html(xml)代码结构就是一个树结构
根节点(根元素):html或者xml最外面的那个标签(元素)
节点:树结构中每一个元素(标签)就是一个节点
节点属性:标签属性
节点内容:标签内容
“”"

xml数据格式

xml和json一样,是一种通用的数据格式(绝大部分编程语言都支持的数据格式)

“”"
xml保存数据是通过标签(元素)的标签内容和标签属性来保存数据的

“”"

xpath语法

1.创建树结构获取数的根节点

etree.XML(xml数据)

etree.HTML(html数据)

f = open(‘零零.xml’,encoding=‘utf-8’)
root = etree.HML(f.read())

2.根据xpath获取指定标签

节点对象.xpath(路径)
“”"
路径写法:
1.决定路径: 用”/“开头路径 - 标签在树结构中的路径(路径必须从根节点开始写)
2.相对路径: 路径开头用”.“标签当前节点,”…“表示当前节点的上层节点
3.全路径:用”//“开头的路径,在整个树中获取标签
注意:绝对路径和全路径的写法以及查找方式和是用谁去点的xpath无关
“”"

result = root.xpath('/supermarkeket/staffs/staff/name/text()')
print(result)
resulr = root.xpath('./staffs/staff')[0]#获取第一个员工对应的staff标签
print(resulr)
result = staff1.xpath('./name/text()')#获取所有员工对应的staff标签
print(result)
result = root.xpath('//naem/text()')
print(result)
result = root.xpath('//goods/name/text()')
print(result)

获取标签内容

节点对象.xpath(获取标签路径/text()):获取指定路径下所有标签的标签内容
获取标签属性值
节点对象xpath(获取标签的路径/@属性名)

result = root.xpath('/supermarket/@name')
print(result)
result = root.xpath('//staff/@id')
print(result)

谓语(条件)

位置相关的条件

“”"
[N]:第n个
[last()]:获取最后一个标签
[last()-n]:获取倒数-n个标签 [list()-1]获取倒数第二个标签
[pasition()>n],[pasition()<n],[pasition()<=n],[pasition()>=n]
“”"

result = root.xpath('//staff[1]/name/text()')
print(result)
result = root.xpath('//staff[last()]/name/text()')
print(result)
result = root.xpath('//staff[last()-1]/name/text()')
print(result)
result = root.xpath('//staff[pasition()>n]/name/text()')
print(result)

属性相关谓语

“”"
[@属性名=属性值]:获取指定属性是指定值的标签
[属性名]:拥有指定属性的标签

“”"

# staff[@cals="c1"] == staff.c1
result = root.xpath('//staff[@clas="c1"]/name/text()')
print(result)
result = root.xpath('//goods[@disconut]/name/text()')
print(result)

子标签内容相关的谓语

“”"
[子标签名>数据]
[子标签名<数据]
[子标签名>=数据]
[子标签名<=数据]
[子标签名=数据]
“”"

result = root.xpath('//goods[price=2]/name/text()')
print(result)

通配符:写路径的时候用*来表示任意标签或者任意属性

result = root.xpath('//staff[1]/*/text()')
print(result)

若干路径 - |

路径1|路径2:同时获取路径1和路径2的内容

多线程基本理论

“”"
进程:一个运行的应用程序就是一个进程。每个进程均运行在其专门且受保护的内存空间中
线程:线程是进程执行任务的基本单元(一个进程中的任务都是在线程中执行的)
进程就像车间,线程就像车间里的工人
一个进程默认一个线程,这个线程叫做主线程
线程的特点:如果在一个线程中执行多个任务,任务是串行执行的
当一个程序中有多个任务时,只有一个线程那么程序执行的效率就比较低

多线程:一个进程中有多个线程就是多线程
多线程执行任务的时候,多个任务可以同时(并行)执行

多线程原理:一个cpu同一时间只能调用一个线程,多线程其实是cpu快速
的在多个线程之间切换,造成多个线程同时执行的假象,多线程实现的是
提高cpu利用率
“”"

python使用多线程的方法

一个进程默认只有一个主线程,主线程以外的线程都叫做子线程

pythong程序如果需要子线程,必须创建线程类(Thread)的对象。

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__':
    # 情况1在一个主线程中下载3个电影
    # download('肖生客的救赎')
    # download('霸王别姬')
    # download('阿甘正传')
    #情况2.使用三个子线程分别下载
    # 创建线程对象
    """
    线程对象 = Thread(target=函数,args=元组)
    a.函数:可以是普通函数函数名,也可以是匿名函数。这个函数就是需要子线程中执行的任务
    b.元组:元组中的元素就是在子线程中调用targe对应的函数的时候需要的参数
    """
    t1 = Thread(target=download,args=('肖生克的救赎',))
    t2 = Thread(target=download,args=('霸王别姬',))
    t3 = Thread(target=download,args=('阿甘正传',))
    # # 启动线程
    t1.start()
    t2.start()
    t3.start()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值