XPath 的使用

XPath 的使用

   XPath,全称XML Path Language,即XML路径语言,它是一门在XML文档中查找信息的语言,最初用于搜寻XML文档,但是也同样适用于HTML文档的搜索。前面我们在解析或抽取网页信息时,使用的是正则表达式,虽然这是一个万能的方法,但是编写太麻烦了,一旦表达式写错就得不到正确的结果,还有就是可读性不强,写完后估计自己也不知道这是啥回事了,所以在爬虫时可以使用XPath来做相应数据的抽取。

  先列举XPath的常用规则:

举例:

//title[@lang='eng']   代表选择所有名称为 title,同时属性lang的值为eng的节点。

 

1. 实例

from lxml import etree
text = '''
<div><ul><li class="item-0"><a href="link1.html">first item</a></li><li class="item-1"><a href="link2.html">second item</a></li><li class="item-inactive"><a href="link3.html">third item</a></li><li class="item-1"><a href="link4.html">fourth item</a></li><li class="item-0"><a href="link5.html">fifth item</a></li></ul>
</div>
'''
# 实例化一个XPath对象  etree.HTML(html文档)
html = etree.HTML(text)
result = etree.tostring(html)
print(result.decode('utf-8'))

首先导入lxml库的etree模块,然后声明了一段HTML文本,调用etree.HTML()初始化,这样就构造了一个XPath解析对象了。

 

2. 所有节点

使用//开头的XPath规则来选择所有符合的几点,以上面的HTML文本为例,如果要选取所有节点,可以这样实现:

from lxml import etree
html = etree.parse('./test.html',etree.HTMLParser())
result = html.xpath('//*')
print(result)

这里使用*代表所有节点,也就是整个HTML文本中的所有节点都会被获取。返回的是一个列表,每个元素都是一个Element类型。

当然,此处匹配也可以指定节点:

from lxml import etree
html = etree.parse('./test.html',etree.HTMLParser())
result = html.xpath('//li')
print(result)

这里选取的是所有li节点,使用//然后直接加上节点名称即可,调用时直接使用xpath()方法即可。

 

3. 子节点

可以使用//或/来获取子节点,前者包括子孙节点,而后者仅仅是直接子节点:

from lxml import etree
html = etree.parse('./test.html',etree.HTMLParser())
result = html.xpath('//li/a')
print(result)

上面得到的是一个包含所有li元素里面的直接子节点a的一个列表。

 

from lxml import etree
html = etree.parse('./test.html',etree.HTMLParser())
result = html.xpath('//ul//a')

上面获取到的是所有ul节点中的所有a节点。

注意/和//的区别,/用于获取直接子节点,//用于获取子孙节点

 

4. 父节点

使用..可以查找父节点:

from lxml import etree
html = etree.parse('./test.html',etree.HTTPParser())
result = html.xpath('//a[@href="link4.html"]/../@class')
print(result)

上面获取到的就是href属性为link4.html的所有a节点的父节点的class属性

除此以外,还可以使用parent::来获取父节点:

from lxml import etree
html = etree.parse('./test.html',etree.HTTPParser())
result = html.xpath('//a[@href="link4.html"]/parent::*/@class')

 

5. 属性匹配

使用@符号进行属性过滤,比如要选取class为item-1的li节点,可以这样实现:

from lxml import etree
html = etree.parse('./test.html',etree.HTTPParser())
result = html.xpath('//li[@class="item-1"]')

 

6. 文本获取

使用text()方法既可获取节点中的文本(标签体):

from lxml import etree
html = etree.parse('./test.html',etree.HTMLParser())
result = html.xpath('//li[@class="item-0"]/a/text()')
print(result)

转载于:https://www.cnblogs.com/jonas-von/p/9178313.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/251572.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Node --- EventProxy的原理

EventProxy来自于Backbone的事件模块,Backbone的事件模块是Model、View模块的基础功能&#xff0c;在前端有广泛的使用。它在每个非all事件触发时都会触发一次all事件&#xff0c;相关代码如下: // Trigger an event, firing all bound callbacks. Callbacks are passed the /…

spring项目启动执行特定方法

1. 方法上加注解PostConstructCompantpublic class InitDemo{ PostConstruct public void init(){ //项目启动就会执行这个方法 doSomething(); }}2.xml配置init-method<bean id"InitDemo" class"com.xxx.InitDemo" scope"singleton" init-me…

WinCC归档数据报表控件

1、背景 WinCC实现报表历来是老大难&#xff0c;自带的报表功能不好使&#xff0c;又没有好用的第三方控件。虽然网上也有很多实现报表的方法&#xff0c;但是毫无例外的要求使用者具有脚本编程功底&#xff0c;HwDataReport的出现将终结这一现象。您无需一行脚本即可完成…

vue数组操作不更新视图问题

vue 观察数组的变异方法 更新视图 push&#xff08;&#xff09; pop() shift() unshift() splice(i,n,arr) sort(xx) reverse() ex: app.book.push({ name:css, author:lee }) 有些方法不会改变数组 filter() concat() slice() 返回新数组 需要用 新返回的数组 更新原数组 ap…

java中如何计算两个时间段的月份差

直接计算&#xff0c;先取得两个日期的年份和月份&#xff0c;月份差&#xff08;第二年份-第一年份&#xff09;*12 第二月份-第一月份转载于:https://www.cnblogs.com/pretty-guy/p/3284593.html

Node --- Promise中的多异步协作

当我们需要处理多个异步调用时,应该如何处理呢? //首先假设有2个读取文件的异步调用,promise1和promise2 var promise1 readFile ("foo.txt", "utf-8"); var promise2 readFile ("bar.txt", "uft-8");//然后,我们可以使用all()方法…

Software-OO 面向对象思维

2017-11-06 11:02:50 所有编程语言的最终目的都是提供一种“抽象”方法。 解决问题的复杂程度直接取决于抽象的种类及质量。这儿的“种类”是指准备对什么进行“抽象”&#xff1f; 汇编是对基础机器的少量抽象。“命令式”语言是对汇编语言的一种抽象。 &#xff08;Alan Kay …

Go Python 7: 2-Layer Neural Network

转载于:https://www.cnblogs.com/wordchao/p/9182511.html

LiveWriter测试

test livewriter 转载于:https://www.cnblogs.com/wujun/archive/2006/11/21/567052.html

第三次实验报告

项目一 项目分析 本项目目的就是考察我们调用searching类和sorting类中的方法&#xff0c;通过提交测试用例设计情况&#xff08;正常&#xff0c;异常&#xff0c;边界&#xff0c;正序&#xff0c;逆序&#xff09;确保类的可行性 代码截图 排序截图 运行截图 项目二 代码截…

Node --- 构建一个HTTP服务

代码如下: var http require(http); http.createServer(function (req, res){res.writeHead(200,{Content-Type: text/plain});res.end(Hello World\n); }).listen(1337, 127.0.0.1); console.log(Server running at http://127.0.0.1:1337);运行如下&#xff1a; 详情见《深…

python中#!/usr/bin/python与#!/usr/bin/env python的区别

目的是在运行python脚本的时候告诉操作系统我们要用python解释器去运行py脚本 所以我们在第一句往往会写如下两句中的其中一句&#xff1a; #!/usr/bin/python或 >#!/usr/bin/env python 就是说在没有在执行程序时指出用什么程序运行py脚本时,系统会去调用python程序来执行。…

页面级缓存@ OutputCache

最近要用到缓存&#xff0c;所以才去找了相关资料&#xff0c;开始在一个用户控件头加入 OutputCache指令&#xff0c;发现第一次进入页面是对了&#xff0c;第二次再进入时就出错了。郁闷……这里 OutputCache的一些参数说明: 以声明的方式控制 ASP.NET 页或页中包含的用户控件…

$.ajax的一些坑啊

1.如果发送ajax返回的数据为json务必设置其 Content-Type:application/json;charsetUTF-8不然会导致其success:function(data)中的data返回的为字符串&#xff0c;导致后面的文本解析失败 转载于:https://www.cnblogs.com/lonecloud/p/7794670.html

JavaScript --- 解析Cookie

var parseCookie function(cookie){var cookies {};if(!cookie){return cookies;}var list cookie.split(;);for (var i0;i<list.length;i){var pair list[i].split();cookies[pair[0].trim()] pair[1];}return cookies; };

DDR3和eMMC区别

DDR3内存条和eMMC存储器区别&#xff1a; 1. 存储性质不同&#xff1b;2. 存储容量不同&#xff1b;3. 运行速度不同&#xff1b;4. 用途不同。 具体区别如下&#xff1a; 1、存储性质不同&#xff1a;eMMC是非易失性存储器&#xff0c;不论在通电或断电状态下&#xff0c;数据…

Sql Server临时表中插入标示列

select ROW_NUMBER() over( order by sort_id asc) as rows,* into #tmp_tb from tb_district 其中sort_id为您原表的排序列。 tb_district为要操作的表。 转载于:https://www.cnblogs.com/daretodream/archive/2013/04/03/2997800.html

17秋 软件工程 团队第五次作业 Alpha Scrum3

17秋 软件工程 团队第五次作业 Alpha Scrum3 今日完成的任务 杰麟&#xff1a;java后端学习&#xff1b;世强&#xff1a;Android的部门基础信息模块的信息显示和对接后台&#xff1b;港晨&#xff1a;后台管理登陆界面ui设计&#xff1b;树民&#xff1a;超级管理员Web后端数据…

Node --- Basic认证

Basic认证: 当客户端与服务器端进行请求时,允许通过用户名和密码实现的一种身份认证方式. // 如果一个页面需要Basic认证,它会检查请求报文头中的Authorization字段的内容,该字段的值由认证方式和加密值构成: $ curl -v "http://user:passwww.baidu.com/" > GET …

用列表+for循环生成乘法口诀表

1 # 结合一下列表生成&#xff0c; 准备设计乘法表2 # numlist [1,2,3,4,5]3 # [pow(i,3) for i in numlist]4 # ## [1, 8, 27, 64, 125]5 # [[pow(i,2), pow(i,3), pow(i,4) ] for i in numlist]6 # ## [[1, 1, 1], [4, 8, 16], [9, 27, 81], [16, 64, 256], [25, 125, 625]]…