XPath 使用路径表达式在 XML 文档中进行导航
XPath上下文:
当前节点(./):
如./sender表示选择当前节点下的sender节点集合(等同于下面所讲的"特定元素",如:sender)
父节点(../):
如../sender表示选择当前节点的父节点下的sender节点集合
根元素(/):
如/messages表示选择从文档根节点下的messages节点集合.
根节点(/*):
这里的*是代表所有节点,但是根元素只有一个,所以这里表示根节点。/*的返回结果和/messages返回的结果一样都是messages节点。
递归下降(//):
XPath中的核心就是节点(Node),定义了7种不同类型的节点: 元素(Element)、属性(Attribute)、文本(Text)、命名空间(Namespace)、处理指令(processing-instruction)、注释(Comment)和文档节点(Document nodes)
这些节点组成一棵节点树,树的根节点被称为文档节点。
路径表达式: 解释
/html/body/ul/li 从根节点开始依照路径选取li元素。返回多个。
//ul/li[1] 还是选取li元素,但是路径多级跳跃到ul/li。[1]表示只取第一个li。
//li[last()] 还是选取li,但路径更跳跃。[last()]表示取最后一个li元素。
//li[@class] 选取根节点的名为li且有class属性的所有后代。
//li[@class=”item”] 选择根节点的名为li且class属性为item的所有后代。
//body/*/li 选取body的名为li的孙子节点。*是通配符,表示任何节点。
//li[@*] 选取所有带属性的li元素。
//body/div | //body/ul 选取body的所有div和ul元素。
body/div 相对路径,选取当前节点的body元素的子元素div。绝对路径以 / 开始。
Xpath的函数很多,涉及到错误、数值、字符串、时间等等,然而我们从网页中提取数据的时候只会用到很少的一部分。其中最重要的就是字符串相关的函数,比如contains()函数。
contains(a, b)
如果字符串a包含字符串b,则返回true,否则返回false。
比如: contains(‘猿人学Python’, ‘Python’),返回true
那么它用在什么时候呢?我们知道,一个html标签的class是可以有多个属性值的,比如:
<div class="post-item text-red text-center">
...
</div>
这段html中div有三个class值,第一个表面它是一条发布的消息,后面两个是对格式做了更多的设置。如果我们想提取网页中所有发布的消息,只需要匹配到post-item 即可,这时候就可以用上contains了:
doc.xpath('//div[contains(@class, "post-item")]')