python lxml包——解析xml文件遇到的问题处理
来源:互联网 发布:淘宝客服月工作计划 编辑:程序博客网 时间:2024/05/22 06:54
preface: 最近的任务需要解析xml文件,毋庸置疑用lxml,普通的解析流程网上博客甚多w3cschool里的就足够了,不用再赘言。可是处理的文件里面,明明有那个结点但xpath就是找不到,不知道为何,查找资料用print大法找到了目标,先记录下来。
print nodeprint node.attribprint node.xpath("child::*")print node.xpath(".//*[@href]")for i in node.xpath(".//*[@href]"): print i, i.text
首先node的attrib属性是一个字典,可以直接print,打印定位当前节点是哪个。
其次,node.xpath("child::*")帮助找到这个节点下,所有字节点有哪些。
若是依然还是找不到目标节点,根据目标节点可能有的属性来找目标节点,print大法。
当然,还有其他方法,但是这些足够了,另外的一些处理参考了网友博客。
[XPath] XPath 与 lxml (三)XPath 坐标轴
XPath 坐标轴
坐标轴用于定义当对当前节点的节点集合。
坐标轴名称含义ancestor选取当前节点的所有先辈元素及根节点。ancestor-or-self选取当前节点的所有先辈以及当前节点本身。attibute选取当前节点的所有属性。child选取当前节点的所有子元素。descendant选取当前节点的所有后代元素。descendant-or-self选取当前节点的所有后代元素以及当前节点本身。following选取文档中当前节点的结束标签之后的所有节点。following-sibling选取当前节点之后的所有同级节点namespace选取当前节点的所有命名空间节点。parent选取当前节点的父节点。preceding选取当前节点的开始标签之前的所有节点。preceding-sibling选取当前节点之前的所有同级节点。self选取当前节点。位置路径表达式
位置路径可以是绝对路径,也可以是相对路径。绝对路径以 "/" 开头。每条路径包括一个或多个步,每步之间以 "/" 分隔。
绝对路径:/step/step/...
相对路径:step/step/...
每步根据当前节点集合中的节点计算。
步(step)包括三部分:
- 坐标轴(axis):定义所选节点与当前节点之间的关系。
- 节点测试(node-test):识别某个坐标轴内部的节点。
- 预判(predicate):提出预判条件对节点集合进行筛选。
步的语法:
坐标轴::节点测试[预判]
实例:
# child::nodename 选取所有属于当前节点的 book 子元素,等价于 './nodename'>>> root.xpath('child::book')[<Element book at 0x2d888c8>, <Element book at 0x2d88878>]>>> root.xpath('./book')[<Element book at 0x2d888c8>, <Element book at 0x2d88878>]# attribute::lang 选取当前节点的 lang 属性,等价于 './@lang'>>> root.xpath('//*[@lang]')[0].xpath('attribute::lang')['eng']>>> root.xpath('//*[@lang]')[0].xpath('@lang')['eng']# child::* 选取当前节点的所有子元素,等价于 './*'>>> root.xpath('child::*')[<Element book at 0x2d88878>, <Element book at 0x2d88738>]>>> root.xpath('./*')[<Element book at 0x2d88878>, <Element book at 0x2d88738>]# attribute::* 选取当前节点的所有属性,等价于 './@*'>>> root.xpath('//*[@*]')[0].xpath('attribute::*')['eng']>>> root.xpath('//*[@*]')[0].xpath('@*')['eng']# child::text() 选取当前节点的所有文本子节点,等价于 './text()'>>> root.xpath('child::text()')['\n ', '\n ', '\n']>>> root.xpath('./text()')['\n ', '\n ', '\n']# child::node() 选取当前节点所有子节点,等价于 './node()'>>> root.xpath('child::node()')['\n ', <Element book at 0x2d88878>, '\n ', <Element book at 0x2d88738>, '\n']>>> root.xpath('./node()')['\n ', <Element book at 0x2d88878>, '\n ', <Element book at 0x2d88738>, '\n']# descendant::book 选取当前节点所有 book 后代,等价于 './/book'>>> root.xpath('descendant::book')[<Element book at 0x2d88878>, <Element book at 0x2d88738>]>>> root.xpath('.//book')[<Element book at 0x2d88878>, <Element book at 0x2d88738>]# ancestor::book 选取当前节点所有 book 先辈>>> root.xpath('.//title')[0].xpath('ancestor::book')[<Element book at 0x2d88878>]# ancestor-or-self::book 选取当前节点的所有 book 先辈以及如果当前节点是 book 的话也要选取>>> root.xpath('.//title')[0].xpath('ancestor-or-self::book')[<Element book at 0x2d88878>]>>> root.xpath('.//book')[0].xpath('ancestor-or-self::book')[<Element book at 0x2d88878>]>>> root.xpath('.//book')[0].xpath('ancestor::book')[]# child::*/child::price 选取当前节点的所有 price 孙节点,等价于 './*/price'>>> root.xpath('child::*/child::price')[<Element price at 0x2d88878>, <Element price at 0x2d88738>]>>> root.xpath('./*/price')[<Element price at 0x2d88878>, <Element price at 0x2d88738>]
参考:
w3cschool xpath:http://www.phpstudy.net/e/xpath/
http://www.cnblogs.com/ifantastic/tag/XPath/
http://blog.csdn.net/betabin/article/details/24392369
0 0
- python lxml包——解析xml文件遇到的问题处理
- python 利用lxml 解析xml文件
- Python解析xml文件遇到的编码解析的问题
- lxml解析xml文件
- python解析xml之lxml
- python+lxml解析大XML文件(100M+)
- 解析xml文件遇到奇怪的问题
- XStream解析xml文件遇到的问题
- 解析xml文件遇到奇怪的问题
- lxml安装遇到的问题
- 安装lxml遇到的问题
- python xml 处理模块 lxml官方网站
- python处理类xml文件遇到的坑
- python中lxml模块生成xml文件
- python使用lxml操作XML文件
- java xml文件解析时遇到的编码问题
- python中利用lxml模块解析xml文件报错XMLSyntaxError: Opening and ending tag mismatch
- python文件处理:解析.xml文件
- C++中的命名空间、using用法、区域运算符(::)详解
- spark count统计元素个数
- 线程的加入
- 【HUSTOJ】1030: 恰好使s=1+1/2+1/3+…+1/n的值大于X时n的值
- leetcode 034 Search For A Range
- python lxml包——解析xml文件遇到的问题处理
- buntu+Apache+PHP+Mysql环境搭建(完整版)
- 线程的礼让
- Android 编译Lame&简单使用
- HDU1572下沙小面的(2)
- C++实验5数组分离
- 后台线程
- C#反射Assembly 详细说明【1】
- C++调用Matlab画图 V2.0