博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Xpath语法详解
阅读量:4695 次
发布时间:2019-06-09

本文共 5973 字,大约阅读时间需要 19 分钟。

本次示例使用python的lxml 对xpath进行演示

安装lxml

pip install lxml

xpath常规用法

示例html

htm = """	
"""

查找xxx下的所有xx元素

from lxml import etree  # 在pycharm中遇到红线提示找不到etree的初始化方法,没关系不影响(File → settings → project → project interpreter重新加载一下即可)htm = """	
"""selector = etree.HTML(htm) # 初始化etreeall_li = selector.xpath('//div/ul/li') # //代表从节结点开始查找,这里查找ul下为li的所有元素for i in all_li: print(i)执行结果:
# 0x1a7955a2808是内存地址,这是一组元素,如要显示具体可以这样(如:/a/text() # 查看a标签的文本(往下看也有演示))

查找xxx下的第一个xx元素

from lxml import etree   # 在pycharm中遇到红线提示找不到etree的初始化方法,没关系不影响(File → settings → project → project interpreter重新加载一下即可)htm = """	
"""selector = etree.HTML(htm) # 初始化etreeall_li = selector.xpath('//div/ul/li[1]') # 查找第一个li,注意在xpath中第一个下标不是0,而是1print(all_li)执行结果: [
]

注意:如果网页中存在多个相同元素,不使用下标进行查找,系统只会默认查找第一个,若第一个元素不符会直接抛出异常。

查找xx元素对应的文本信息

from lxml import etree   # 在pycharm中遇到红线提示找不到etree的初始化方法,没关系不影响(File → settings → project → project interpreter重新加载一下即可)htm = """	
"""selector = etree.HTML(htm) # 初始化etree# all_li = selector.xpath('//div/ul/li[1]/a/text()')[0] # 这样写直接输出a下面的第一个文本all_li = selector.xpath('//div/ul/li[1]/a/text()') # 使用text()提取a标签下的文本信息print(all_li) # 也可以使用下标直接取出结果如:all_li[0]输出结果 first item执行结果: ['first item']

小知识

如果在使用的html页面中只要元素是唯一的,也可以不从根目录开始查找,简单示例几种:

all_li = selector.xpath('//ul/li[1]/a/text()')[0]  #省去div一样可以all_li = selector.xpath('//*[@class="item-inactive"]/a/text()')[0]  # 直接使用class查找第三个li的文本all_li = selector.xpath('//a[@href="link2.html"]/text()')[0]  # 直接使用href查找第二个li的文本

获取xxx下元素的属性

获取单个属性

from lxml import etree   # 在pycharm中遇到红线提示找不到etree的初始化方法,没关系不影响(File → settings → project → project interpreter重新加载一下即可)htm = """	
"""selector = etree.HTML(htm) # 初始化etreeall_li = selector.xpath('//li[3]/a/@href')[0] # 获取href的属性print(all_li) 执行结果: link3.html

获取xxx对应的全部属性

from lxml import etree  # 在pycharm中遇到红线提示找不到etree的初始化方法,没关系不影响(File → settings → project → project interpreter重新加载一下即可)htm = """	
"""selector = etree.HTML(htm) # 初始化etreeall_li = selector.xpath('//li/@class') # 获取名称为class的全部属性print(all_li)执行结果: ['item-0', 'item-1', 'item-inactive', 'item-1', 'item-0', 'else-1']

xpath高级用法

查找出xxx元素以xx开头的属性

还是这段html来做演示:

	
"""

使用starts-with()

示例代码:

from lxml import etree  # 在pycharm中遇到红线提示找不到etree的初始化方法,没关系不影响(File → settings → project → project interpreter重新加载一下即可)htm = """	
"""selector = etree.HTML(htm) # 初始化etreeall_li = selector.xpath("//li[starts-with(@class, 'item-')]") # 获取href的属性all_a = []for i in all_li: all_a.append(i.xpath('a/text()')[0]) # 继续对找到的li元素使用xpath查找其里面的内容print(all_a)执行结果: ['first item', 'second item', 'third item', 'fourth item', 'fifth item']

也可以这样写:

from lxml import etree  # 在pycharm中遇到红线提示找不到etree的初始化方法,没关系不影响(File → settings → project → project interpreter重新加载一下即可)htm = """	
"""selector = etree.HTML(htm) # 初始化etreeall_li = selector.xpath("//li[starts-with(@class, 'item-')]/a/text()") # 获取href的属性print(all_li)执行结果: ['first item', 'second item', 'third item', 'fourth item', 'fifth item']

查找所有文本

使用string()

示例代码:

from lxml import etree  # 在pycharm中遇到红线提示找不到etree的初始化方法,没关系不影响(File → settings → project → project interpreter重新加载一下即可)htm = """	
"""selector = etree.HTML(htm) # 初始化etreeall_li = selector.xpath("string(//ul)") # 获取ul下的所有文本print(all_li)执行结果: first item second item third item fourth item fifth item something else this is ul item

小小实例

获取豆瓣首页的豆瓣读书文本及链接,在首页取出一张图片存入本地。

import requestsfrom lxml import etree  # 在pycharm中遇到红线提示找不到etree的初始化方法,没关系不影响(File → settings → project → project interpreter重新加载一下即可)r = requests.get('https://www.douban.com/')r.encoding = 'utf-8'html = etree.HTML(r.text)text = html.xpath('//*[@id="anony-nav"]/div[1]/ul/li[1]/a/@href')[0]h1 = html.xpath('//*[@id="anony-nav"]/div[1]/ul/li[1]/a/text()')[0]logs = html.xpath('//*[@id="anony-sns"]/div/div[3]/div/div[1]/ul/li[3]/div/a/img/@src')[0]print(text)print(h1)print(logs)log = requests.get(logs)with open('d:/a.gif', 'wb') as file:  # wb 二进制形式写入    file.write(log.content)  # 保存图片执行结果:	https://book.douban.com	豆瓣读书	https://img3.doubanio.com/f/shire/a1fdee122b95748d81cee426d717c05b5174fe96/pics/blank.gif

转载于:https://www.cnblogs.com/weibgg/p/10786985.html

你可能感兴趣的文章
html5录音支持pc和Android、ios部分浏览器,微信也是支持的,JavaScript getUserMedia
查看>>
虚幻UE4的后处理特效介绍 http://www.52vr.com/thread-31215-1-1.html
查看>>
MapReduce单机提交(待稿)
查看>>
2017-2018-1 20155317 《信息安全系统设计基础》第四周学习总结
查看>>
将金额人民币转化为大写 C#
查看>>
Excel VBA 操作 复制拷贝操作
查看>>
Robotframework--随机选取下拉框的字段值进行搜索
查看>>
【TCP/IP】TCP的三次握手和四次挥手
查看>>
总结ThinkPHP使用技巧经验分享(三)
查看>>
python json.dumps()函数输出json格式,使用ensure_ascii参数对中文输入的支持
查看>>
eclipse中安装flex插件
查看>>
javascript学习笔记 - 引用类型 Object
查看>>
RabbitMQ 开启WEB管理
查看>>
Autoware(2)—加载地图数据
查看>>
前端开发人员需知——浏览器详解
查看>>
Javascript杂记(一)
查看>>
Html5+NodeJS——拖拽多个文件上传到服务器
查看>>
分布式和集群的区别
查看>>
editor does not contain a main type的解决方案
查看>>
[编织消息框架][优化系统]突破连接上限(上)
查看>>