首页 > 其他分享 >解析: xpath

解析: xpath

时间:2023-04-03 23:12:22浏览次数:29  
标签:xpath tree list li print 解析 id

解析_1_xpath基本使用

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8"/>
    <title>Title</title>
</head>
<body>
    <ul>
        <li id="l1" class="c1">北京</li>
        <li id="2l">上海</li>
        <li >深圳</li>
        <li >武汉</li>
    </ul>
    <ul>
        <li id="i1" class="c1">大连</li>
        <li class="c2">锦州</li>
        <li>沈阳</li>
    </ul>
</body>
</html>

"""                                                           
                                       .-''-.               
.--.                    _..._        .' .-.  )              
|__|                  .'     '.     / .'  / /               
.--..-,.--.          .   .-.   .   (_/   / /                
|  ||  .-. |         |  '   '  |        / /                 
|  || |  | | _    _  |  |   |  |       / /         _    _   
|  || |  | || '  / | |  |   |  |      . '         | '  / |  
|  || |  '-.' | .' | |  |   |  |     / /    _.-').' | .' |  
|__|| |    /  | /  | |  |   |  |   .' '  _.'.-'' /  | /  |  
    | |   |   `'.  | |  |   |  |  /  /.-'_.'    |   `'.  |  
    |_|   '   .'|  '/|  |   |  | /    _.'       '   .'|  '/ 
           `-'  `--' '--'   '--'( _.-'           `-'  `--'  
Created on 2023/4/3 21:38.
@Author: haifei
"""
import time
from lxml import etree


'''
xpath解析两种方式
1、本地文件
    etree.parse
2、服务器响应的数据(response.read().decode('utf-8'))             <---主用
    etree.HTML()

xpath基本语法:
    1.路径查询
        //:查找所有子孙节点,不考虑层级关系
        / :找直接子节点
    2.谓词查询
        //div[@id]
        //div[@id="maincontent"]
    3.属性查询
        //@class
    4.模糊查询
        //div[contains(@id, "he")]
        //div[starts‐with(@id, "he")]
    5.内容查询
        //div/h1/text()
    6.逻辑运算(用的情况比较少)
        //div[@id="head" and @class="s_down"]
        //title | //price
'''


tree = etree.parse('./解析_1_xpath基本使用.html')
print(tree)  # <lxml.etree._ElementTree object at 0x1028bf100>


# 查找body下的li
li_list = tree.xpath('//body/ul/li')
print(li_list)
print(len(li_list))
li_list2 = tree.xpath('//body//li')  # 效果同li_list
print(li_list2)
print(len(li_list2))


# 查找所有有id的属性的li标签
li_list = tree.xpath('//li[@id]')
print(li_list)
print(len(li_list))
li_list = tree.xpath('//li[@id]/text()')  # text()获取标签中的内容
print(li_list)  # ['北京', '上海', '大连']


# 找到id为l1的li标签
li_list = tree.xpath('//li[@id="l1"]/text()')  # 注意嵌套引号
print(li_list)  # ['北京']


# 查找到id为l1的li标签的class的属性值
li = tree.xpath('//li[@id="l1"]/@class')
print(li)  # ['c1']


# 查询id中包含l的li标签
li_list = tree.xpath('//li[contains(@id,"l")]/text()')
print(li_list)  # ['北京', '上海']


# 查询id的值以i开头的li标签
li_list = tree.xpath('//li[starts-with(@id,"i")]/text()')
print(li_list)  # ['大连']


#查询id为l1和class为c1的li标签
li_list = tree.xpath('//li[@id="l1" and @class="c1"]/text()')
print(li_list)  # ['北京']

#查询id为l1或class为c2的li标签
li_list = tree.xpath('//li[@id="l1"]/text() | //li[@class="c2"]/text()')  # 注意|后边需要重写路径符
print(li_list)  # ['北京', '锦州']


if __name__ == '__main__':
    start = time.time()
    print('It takes', time.time() - start, "seconds.")

解析_2_获取百度首页百度一下四个大字

image

"""                                                           
                                       .-''-.               
.--.                    _..._        .' .-.  )              
|__|                  .'     '.     / .'  / /               
.--..-,.--.          .   .-.   .   (_/   / /                
|  ||  .-. |         |  '   '  |        / /                 
|  || |  | | _    _  |  |   |  |       / /         _    _   
|  || |  | || '  / | |  |   |  |      . '         | '  / |  
|  || |  '-.' | .' | |  |   |  |     / /    _.-').' | .' |  
|__|| |    /  | /  | |  |   |  |   .' '  _.'.-'' /  | /  |  
    | |   |   `'.  | |  |   |  |  /  /.-'_.'    |   `'.  |  
    |_|   '   .'|  '/|  |   |  | /    _.'       '   .'|  '/ 
           `-'  `--' '--'   '--'( _.-'           `-'  `--'  
Created on 2023/4/3 22:40.
@Author: haifei
"""
import time
from lxml import etree
from urllib import request


# (1) 获取网页的源码
# (2) 解析(用etree.HTML解析的服务器响应的文件)
# (3) 打印


url = 'https://www.baidu.com/'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36'
}


# 请求对象的定制
_request = request.Request(url=url, headers=headers)
# 模拟浏览器访问服务器
response = request.urlopen(_request)
# 获取网页源码
content = response.read().decode('utf-8')


# 解析服务器响应的文件
tree = etree.HTML(content)
# 获取想要的数据
print(tree.xpath('//input[@id="su"]/@value'))  # ['百度一下']
result = tree.xpath('//input[@id="su"]/@value')[0]  # xpath的返回值是一个列表类型的数据
print(result)  # 百度一下


if __name__ == '__main__':
    start = time.time()
    print('It takes', time.time() - start, "seconds.")

标签:xpath,tree,list,li,print,解析,id
From: https://www.cnblogs.com/yppah/p/17284846.html

相关文章

  • (4.3)数组、对象及类数组对象,set的用法,正则表达式的常用方法,蓝桥杯备赛-(生成数组、数
    1.1数组、对象及类数组对象1.数组:​ 数组是有序的数据集合,其中的索引值从0开始递增,并且数组有length属性,可以获取数组内的元素个数,其中的值可以是任何的数组类型。2.对象:​ 对象是无序的是由一个或多个键值对组成的数据集合,对象没有length属性。3.伪数组(类数组对象):​ ......
  • 设计模式(三十一)----综合应用-自定义Spring框架-自定义Spring IOC-定义解析器、IOC容
    3定义解析器相关类3.1BeanDefinitionReader接口BeanDefinitionReader是用来解析配置文件并在注册表中注册bean的信息。定义了两个规范:获取注册表的功能,让外界可以通过该对象获取注册表对象。加载配置文件,并注册bean数据。/***@versionv1.0*@ClassName:BeanDe......
  • 软件加壳输入表处理-解析
    本篇博文说下PE文件中输入表的格式和具体的使用,以及在软件加壳中的注意事项(本人菜鸟),高手飘过IMAGE_IMPORT_DESCRIPTORSTRUC{unionCharacteristicsDWORDOriginalFirstThunkDWORDendsTimeDateStampDWORDForwardChainDWORDNameD......
  • FastThreadLocal源码解析
    Netty为什么要用自己的FastThreadLocal?threadLocalHash冲突,检索时间长。Netty自己定义的fastThreadLocal用的是数组,直接数组下标检索快。下面以ftl作为FastThreadLocal的简称例子ftl只有在FastThreadLocalThread线程中运行才生效,不然会走SlowGet模式(jdkthreadLocal方式)publiccl......
  • RocketMQ NameServer启动流程解析
    具体分析可参考Gitee项目NameServer解析部分=》代码地址什么是NameServer简易Topic路由注册中心,用于支持Broker的服务注册与发现。类似Dubbo的zookeeper主要能力Broker集群管理:管理Broker集群注册信息,心跳检测broker存活路由信息管理:保存Broker集群路由信息,然后producer、consumer......
  • 实现一个函数用来解析 URL 的 querystring
    实现如下效果consturl="https://xxxx.com?a=3&b=4&c=5&name=1+1=2";//解析后得到qs如下constqs={a:3,b:4,c:5,name:'1+1=2'};纯碎使用 javascript 完成解析函数,而不利用浏览器DOM特性API,代码如下所示,细节在注释中体现functionparse(url......
  • 详细解析Java异步线程处理队列任务工具类以及实战
    场景待入快速理解小场景描述:【一群人】来到【一个大厅】办理业务,大厅中有【多个窗口】给我们办理业务。每个人都有自己要办事情,处理过程需要消耗时间。大厅根据人群多少,开始窗口梳理。如果把“一群人”理解成一群待处理的n个【任务】,把这群人排成一个长队就形成了一个【任......
  • Mybatis配置文件解析(转载)
    流程图demo案例还是从案例开始。publicstaticvoidmain(String[]args){Stringresource="mybatis-config.xml";InputStreaminputStream=null;SqlSessionsqlSession=null;try{inputStream=Resources.getResourceAsStream(resourc......
  • 软考高项第4版教程-差异点解析来啦(第5章下)!
    第5章信息系统工程,我拆分成2篇来解析第4版教程的差异重点,上篇解析了“软件工程”和“数据工程”知识块,这次带来下篇:“系统集成”和“安全工程”知识块。“信息系统工程”文字版“系统集成”讲了4部分知识点,分别是网络集成、数据集成、软件集成和应用集成。1.系统集成4个基本原则在......
  • Thrift 格式解析
    Thrift格式解析https://www.cnblogs.com/Forever-Kenlen-Ja/p/9649724.html常用数据格式包括CSVJSONXML,这些格式有缺点:CSV没有指定数据类型,如可能将数字开头的字符串无认为数字使用文本存储会浪费空间JSONXML注重可读,提高程序员效率,但数据存储传输效率不高,尤其大数......