python lxml包——解析xml文件遇到的问题处理

preface: 最近的任务需要解析xml文件,毋庸置疑用lxml,普通的解析流程网上博客甚多w3cschool里的就足够了,不用再赘言。可是处理的文件里面,明明有那个结点但xpath就是找不到,不知道为何,查找资料用print大法找到了目标,先记录下来。
print node
print node.attrib
print 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')
[, ]
>>> root.xpath('./book')
[, ]

# attribute::lang 选取当前节点的 lang 属性,等价于 './@lang'
>>> root.xpath('//*[@lang]')[0].xpath('attribute::lang')
['eng']
>>> root.xpath('//*[@lang]')[0].xpath('@lang')
['eng']

# child::* 选取当前节点的所有子元素,等价于 './*'
>>> root.xpath('child::*')
[, ]
>>> root.xpath('./*')
[, ]

# 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    ', , '\n    ', , '\n']
>>> root.xpath('./node()')
['\n    ', , '\n    ', , '\n']

# descendant::book 选取当前节点所有 book 后代,等价于 './/book'
>>> root.xpath('descendant::book')
[, ]
>>> root.xpath('.//book')
[, ]

# ancestor::book 选取当前节点所有 book 先辈
>>> root.xpath('.//title')[0].xpath('ancestor::book')
[]

# ancestor-or-self::book 选取当前节点的所有 book 先辈以及如果当前节点是 book 的话也要选取
>>> root.xpath('.//title')[0].xpath('ancestor-or-self::book')
[]
>>> root.xpath('.//book')[0].xpath('ancestor-or-self::book')
[]
>>> root.xpath('.//book')[0].xpath('ancestor::book')
[]

# child::*/child::price 选取当前节点的所有 price 孙节点,等价于 './*/price'
>>> root.xpath('child::*/child::price')
[, ]
>>> root.xpath('./*/price')
[, ]

参考:
w3cschool xpath: http://www.phpstudy.net/e/xpath/ 
http://www.cnblogs.com/ifantastic/tag/XPath/ 
http://blog.csdn.net/betabin/article/details/24392369

你可能感兴趣的:(python,包)