Python基于lxml模块解析html获取页面内所有叶子节点xpath路径功能示例


Posted in Python onMay 16, 2018

本文实例讲述了Python基于lxml模块解析html获取页面内所有叶子节点xpath路径功能。分享给大家供大家参考,具体如下:

因为需要使用叶子节点的路径来作为特征,但是原始的lxml模块解析之后得到的却是整个页面中所有节点的xpath路径,不是我们真正想要的形式,所以就要进行相关的处理才行了,差了很多网上的博客和文档也没有找到一个是关于输出html中全部叶子节点的API接口或者函数,也可能是自己没有那份耐心,没有找到合适的资源,只好放弃了寻找,但是这并不说明没有其他的方法了,在对页面全部节点的xpath输出之后观察得到的结果就是:

1.路径之间存在包含性

2.叶子节点的路径必然包含上一个叶子节点路径到下一个叶子节点路径之间的路径

3.所有的叶子节点均不存在包含性

基于这些观察就可以实践了,我采用的方法是,设置一个标志位,如果当前路径被下一条路径包含的话就把下标加1处理,直到遇上不包含的情况是这一条路径就是一条叶子节点路径,加入结果列表即可,经检验和原始路径列表对比后,结果路径列表均不存在包含性,暂可认为均为叶子节点的路径,不敢确定的说是因为:竟没有大量做实验观察是否有另类,不过方法是可行的,下面是具体实现:

#!usr/bin/env python
#encoding:utf-8
'''''
__author__:沂水寒城
功能:得到页面的叶子节点的xpath
'''
def get_leaf_node_xpath(one_page_xpath):
  '''''
  输入:一个页面的原始xpath路径列表
  输出:只包含页面的叶子节点的xpath列表
  '''
  one_page_xpath.append('0')
  leaf_node_xpath_list=[]
  for i in range(len(one_page_xpath)-1):
    j=i+1
    one_xpath=one_page_xpath[i]
    two_xpath=one_page_xpath[j]
    if one_xpath in two_xpath:
      one_xpath=two_xpath
      two_xpath=one_page_xpath[j+1]
    else:
      leaf_node_xpath_list.append(one_xpath)
  return leaf_node_xpath_list
if __name__ == '__main__':
  with open('baidu.txt') as f:
    html=f.read()
  htree, one_page_xpath=get_clean_allnodes_xpath(html)
  leaf_node_xpath_list=get_leaf_node_xpath(one_page_xpath)
  print leaf_node_xpath_list
  with open('data/dom_leaf_xpath/original_xpath.txt', 'w') as f1:
    for one_line in one_page_xpath:
      f1.write(one_line.strip()+'\n')
  with open('data/dom_leaf_xpath/leaf_xpath.txt', 'w') as f2:
    for one_line in leaf_node_xpath_list:
      f2.write(one_line.strip()+'\n')

打开保存的文件内容为:

original_xpath.txt内容为:

/html
/html/head
/html/head/meta[1]
/html/head/meta[2]
/html/head/meta[3]
/html/head/meta[4]
/html/head/title
/html/body
/html/body/p
/html/body/p/comment()[1]
/html/body/p/comment()[2]
/html/body/p/comment()[3]
/html/body/p/meta
/html/body/div[1]
/html/body/div[1]/div[1]
/html/body/div[1]/div[1]/div
/html/body/div[1]/div[1]/div/div[1]
/html/body/div[1]/div[1]/div/div[1]/div
/html/body/div[1]/div[1]/div/div[1]/div/div[1]
/html/body/div[1]/div[1]/div/div[1]/div/a
/html/body/div[1]/div[1]/div/div[1]/div/form
/html/body/div[1]/div[1]/div/div[1]/div/form/span[1]
/html/body/div[1]/div[1]/div/div[1]/div/form/span[2]
/html/body/div[1]/div[1]/div/div[1]/div/form/span[3]
/html/body/div[1]/div[1]/div/div[1]/div/form/span[3]/span
/html/body/div[1]/div[1]/div/div[1]/div/form/span[3]/span/div
/html/body/div[1]/div[1]/div/div[1]/div/form/span[3]/span/div/span
/html/body/div[1]/div[1]/div/div[1]/div/form/span[3]/span/ul
/html/body/div[1]/div[1]/div/div[1]/div/form/span[3]/span/ul/li[1]
/html/body/div[1]/div[1]/div/div[1]/div/form/span[3]/span/ul/li[1]/a
/html/body/div[1]/div[1]/div/div[1]/div/form/span[3]/span/ul/li[2]
/html/body/div[1]/div[1]/div/div[1]/div/form/span[3]/span/ul/li[2]/a
/html/body/div[1]/div[1]/div/div[1]/div/form/span[3]/span/ul/li[3]
/html/body/div[1]/div[1]/div/div[1]/div/form/span[3]/span/ul/li[4]
/html/body/div[1]/div[1]/div/div[1]/div/form/span[3]/span/ul/li[4]/a
/html/body/div[1]/div[1]/div/div[1]/div/div[2]
/html/body/div[1]/div[1]/div/div[2]
/html/body/div[1]/div[1]/div/div[2]/a[1]
/html/body/div[1]/div[1]/div/div[2]/a[2]
/html/body/div[1]/div[1]/div/div[2]/a[3]
/html/body/div[1]/div[1]/div/div[3]
/html/body/div[1]/div[1]/div/div[3]/a[1]
/html/body/div[1]/div[1]/div/div[3]/a[2]
/html/body/div[1]/div[1]/div/div[3]/a[3]
/html/body/div[1]/div[1]/div/div[3]/a[4]
/html/body/div[1]/div[1]/div/div[3]/a[5]
/html/body/div[1]/div[1]/div/div[3]/a[6]
/html/body/div[1]/div[1]/div/div[3]/a[7]
/html/body/div[1]/div[1]/div/div[3]/a[8]
/html/body/div[1]/div[1]/div/div[3]/a[9]
/html/body/div[1]/div[2]
/html/body/div[1]/div[2]/a[1]
/html/body/div[1]/div[2]/a[2]
/html/body/div[1]/div[2]/a[3]
/html/body/div[1]/div[2]/a[4]
/html/body/div[1]/div[2]/a[5]
/html/body/div[1]/div[2]/a[6]
/html/body/div[1]/div[2]/a[7]
/html/body/div[1]/div[2]/a[8]
/html/body/div[1]/div[2]/a[9]
/html/body/div[1]/div[3]
/html/body/div[1]/div[3]/div
/html/body/div[1]/div[3]/div/div
/html/body/div[1]/div[3]/div/div/div[1]
/html/body/div[1]/div[3]/div/div/div[2]
/html/body/div[1]/div[3]/div/div/div[2]/p
/html/body/div[1]/div[4]
/html/body/div[1]/div[4]/div
/html/body/div[1]/div[4]/div/div
/html/body/div[1]/div[4]/div/div/p[1]
/html/body/div[1]/div[4]/div/div/p[1]/a[1]
/html/body/div[1]/div[4]/div/div/p[1]/a[2]
/html/body/div[1]/div[4]/div/div/p[1]/a[3]
/html/body/div[1]/div[4]/div/div/p[1]/a[4]
/html/body/div[1]/div[4]/div/div/p[2]
/html/body/div[1]/div[4]/div/div/p[2]/a[1]
/html/body/div[1]/div[4]/div/div/p[2]/a[2]
/html/body/div[1]/div[4]/div/div/p[2]/a[3]
/html/body/div[1]/div[5]
/html/body/div[2]
/html/body/div[3]
/html/body/div[4]
0

最后一行的0只是为了代码中列表能够遍历到最后一个路径而不出现索引错误的一个简单的处理,人为的添加了一个元素,没有实际意义,也不会参与处理

leaf_xpath.txt内容为:

/html/head/meta[1]
/html/head/meta[2]
/html/head/meta[3]
/html/head/meta[4]
/html/head/title
/html/body/p/comment()[1]
/html/body/p/comment()[2]
/html/body/p/comment()[3]
/html/body/p/meta
/html/body/div[1]/div[1]/div/div[1]/div/div[1]
/html/body/div[1]/div[1]/div/div[1]/div/a
/html/body/div[1]/div[1]/div/div[1]/div/form/span[1]
/html/body/div[1]/div[1]/div/div[1]/div/form/span[2]
/html/body/div[1]/div[1]/div/div[1]/div/form/span[3]/span/div/span
/html/body/div[1]/div[1]/div/div[1]/div/form/span[3]/span/ul/li[1]/a
/html/body/div[1]/div[1]/div/div[1]/div/form/span[3]/span/ul/li[2]/a
/html/body/div[1]/div[1]/div/div[1]/div/form/span[3]/span/ul/li[3]
/html/body/div[1]/div[1]/div/div[1]/div/form/span[3]/span/ul/li[4]/a
/html/body/div[1]/div[1]/div/div[1]/div/div[2]
/html/body/div[1]/div[1]/div/div[2]/a[1]
/html/body/div[1]/div[1]/div/div[2]/a[2]
/html/body/div[1]/div[1]/div/div[2]/a[3]
/html/body/div[1]/div[1]/div/div[3]/a[1]
/html/body/div[1]/div[1]/div/div[3]/a[2]
/html/body/div[1]/div[1]/div/div[3]/a[3]
/html/body/div[1]/div[1]/div/div[3]/a[4]
/html/body/div[1]/div[1]/div/div[3]/a[5]
/html/body/div[1]/div[1]/div/div[3]/a[6]
/html/body/div[1]/div[1]/div/div[3]/a[7]
/html/body/div[1]/div[1]/div/div[3]/a[8]
/html/body/div[1]/div[1]/div/div[3]/a[9]
/html/body/div[1]/div[2]/a[1]
/html/body/div[1]/div[2]/a[2]
/html/body/div[1]/div[2]/a[3]
/html/body/div[1]/div[2]/a[4]
/html/body/div[1]/div[2]/a[5]
/html/body/div[1]/div[2]/a[6]
/html/body/div[1]/div[2]/a[7]
/html/body/div[1]/div[2]/a[8]
/html/body/div[1]/div[2]/a[9]
/html/body/div[1]/div[3]/div/div/div[1]
/html/body/div[1]/div[3]/div/div/div[2]/p
/html/body/div[1]/div[4]/div/div/p[1]/a[1]
/html/body/div[1]/div[4]/div/div/p[1]/a[2]
/html/body/div[1]/div[4]/div/div/p[1]/a[3]
/html/body/div[1]/div[4]/div/div/p[1]/a[4]
/html/body/div[1]/div[4]/div/div/p[2]/a[1]
/html/body/div[1]/div[4]/div/div/p[2]/a[2]
/html/body/div[1]/div[4]/div/div/p[2]/a[3]
/html/body/div[1]/div[5]
/html/body/div[2]
/html/body/div[3]
/html/body/div[4]

针对这个问题暂时可以想到的方法就是这样的,利用包含性来解决,没有其他的新思路,如果还有新的思路欢迎交流学习!

Python 相关文章推荐
Python使用scrapy采集时伪装成HTTP/1.1的方法
Apr 08 Python
Python实现快速计算词频功能示例
Jun 25 Python
使用python采集脚本之家电子书资源并自动下载到本地的实例脚本
Oct 23 Python
在Python中实现替换字符串中的子串的示例
Oct 31 Python
django使用LDAP验证的方法示例
Dec 10 Python
python实现转盘效果 python实现轮盘抽奖游戏
Jan 22 Python
python经典趣味24点游戏程序设计
Jul 26 Python
Python使用Tkinter实现转盘抽奖器的步骤详解
Jan 06 Python
Python configparser模块操作代码实例
Jun 08 Python
Django后端分离 使用element-ui文件上传方式
Jul 12 Python
Jmeter HTTPS接口测试证书导入过程图解
Jul 22 Python
详解Python爬虫爬取博客园问题列表所有的问题
Jan 18 Python
Python使用Dijkstra算法实现求解图中最短路径距离问题详解
May 16 #Python
Python基于Floyd算法求解最短路径距离问题实例详解
May 16 #Python
Python使用selenium实现网页用户名 密码 验证码自动登录功能
May 16 #Python
Selenium 模拟浏览器动态加载页面的实现方法
May 16 #Python
Python selenium实现微博自动登录的示例代码
May 16 #Python
Python实现统计给定字符串中重复模式最高子串功能示例
May 16 #Python
Python(Django)项目与Apache的管理交互的方法
May 16 #Python
You might like
LotusPhp笔记之:Cookie组件的使用详解
2013/05/06 PHP
php file_get_contents抓取Gzip网页乱码的三种解决方法
2013/11/12 PHP
PHP开发api接口安全验证操作实例详解
2020/03/26 PHP
索趣科技的答案
2007/02/07 Javascript
仿迅雷焦点广告效果(JQuery版)
2008/11/19 Javascript
基于jquery的放大镜效果
2012/05/30 Javascript
js中如何复制一个对象并获取其所有属性和属性对应的值
2013/10/24 Javascript
JavaScript的strict模式与with关键字介绍
2014/02/08 Javascript
php中给js数组赋值方法
2014/03/10 Javascript
基于jQuery的JavaScript模版引擎JsRender使用指南
2014/12/29 Javascript
javascript实现动态改变层大小的方法
2015/05/14 Javascript
javascript实现行拖动的方法
2015/05/27 Javascript
JavaScript中reduce()方法的使用详解
2015/06/09 Javascript
JavaScript计时器用法分析【setTimeout和clearTimeout】
2017/01/18 Javascript
详解Angular4 路由设置相关
2017/08/26 Javascript
微信小程序tabBar用法实例详解
2017/12/04 Javascript
使用typescript开发angular模块并发布npm包
2018/04/19 Javascript
JavaScript 扩展运算符用法实例小结【基于ES6】
2019/06/17 Javascript
[51:27]LGD vs Liquid 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
简介Django中内置的一些中间件
2015/07/24 Python
Python实现拷贝多个文件到同一目录的方法
2016/09/19 Python
Python Requests库基本用法示例
2018/08/20 Python
原生python实现knn分类算法
2019/10/24 Python
python对接ihuyi实现短信验证码发送
2020/05/10 Python
使用matlab 判断两个矩阵是否相等的实例
2020/05/11 Python
CSS3只让背景图片旋转180度的实现示例
2021/03/09 HTML / CSS
如何填写个人简历自我评价
2013/12/10 职场文书
工厂门卫岗位职责范本
2014/04/04 职场文书
作风大整顿心得体会
2014/09/10 职场文书
党的群众路线教育实践活动领导班子整改措施
2014/10/28 职场文书
2014年健康教育工作总结
2014/11/20 职场文书
员工离职通知函
2015/04/25 职场文书
在职证明书模板
2015/06/15 职场文书
导游词之徐州-云龙山
2019/09/29 职场文书
Ajax是什么?Ajax高级用法之Axios技术
2021/04/21 Javascript
使用CSS设置滚动条样式
2022/01/18 HTML / CSS