【干货】xpath语法学习记录
Python Xpath语法
节点
xpath(‘//div’):选取所有div节点,并包含它所有的子节点;
xpath(‘x/div’):选取 x 节点的下一层所有div节点,若 x 没有则从根节点开始;
xpath(‘x/..’):选取 x 节点的父节点;
xpath(‘div/text()’):获得 div 标签中的 text 值;
xpath(‘div/@class’):获得 div 标签中 class 属性的值,class 可替换为其他属性名;
xpath(‘div/@*’):获得 div 标签中所有属性的值;
xpath(‘div/*’):选取 div 节点下所有子节点;
xpath(‘div/*/span’):选取 div 节点下第二级所有span节点;
xpath(‘div/node/name()’):获得node节点的名字;
谓语
xpath(‘/body/div[1]’):选取 body 下第一个 div 节点;
xpath(‘/body/div[last()]’):选取 body 下最后一个 div 节点;
xpath(‘/body/div[last()-1]’):选取 body 下倒数第二个 div 节点;
xpath(‘/body/div[position()<=3]’):选取 body 下前三个 div 节点;
xpath(‘/body/div[not(@class)]’):选取 body 下不含 class 属性的 div 节点;
xpath(‘/body/div[not(@class=”zhang”)]’):选取 body 下不含 class 属性值等于 zhang 的 div 节点;
xpath(‘/body/div[@class]’):选取 body 下含有 class 属性的 div 节点;
xpath(‘/body/div[@class=”zhang”]’):选取 body 下 class 属性值等于 zhang 的 div 节点;
xpath(‘/body/div[contains(@class,”zhang”)]’):选取 body 下 class 属性值含有 zhang 的 div 节点;
*注:若是含有中文,则:keyword = u’中文’ xpath(‘/body/div[contains(@class,”%s”)]’ %(keyword))
或 xpath(u’/body/div[contains(@class,”中文”)]’)*
轴
xpath(‘//a|//div’):选取所有的 a 节点和 div 节点;
xpath(‘/div/self::*’):选取当前 div 节点;
xpath(‘/div/parent::*’):选取 div 节点的父节点;
xpath(‘/div/ancestor::*’):选取 div 节点的所有先辈节点(父、祖父);
xpath(‘/div/ancestor-or-self::‘):选取 div 节点的所有先辈节点包含自身(可以指定节点,将 替换为节点名);
xpath(/div/preceding::* ):选取 div 节点之前的所有节点(可以指定节点,将 * 替换为节点名);
xpath(‘/div/preceding-sibling::‘):选取 div 节点之前的所有兄弟节点(可以指定节点,将 替换为节点名);
xpath(‘/div/following::‘):选取 div 节点之后的所有节点(可以指定节点,将 替换为节点名);
xpath(‘/div/following-sibling::‘):选取 div 节点之后的所有兄弟节点(可以指定节点,将 替换为节点名);
xpath(‘/div/descendant::‘):选取 div 节点的所有后代(子、孙)节点(可以指定节点,将 替换为节点名);
xpath(‘/div/child::‘):选取 div 节点的所有子节点(可以指定节点,将 替换为节点名 );
xpath(‘/div/attribute::‘):获取 div 节点的所有属性值(可以指定属性,将 替换为属性名);
问题及思考
问题1. 若想获取一个节点下的所有内容,但其内容包含在当前节点下的不同子节点中:
解决方案:
- xpath(‘string(//div/some-node)’).extract()[0]
问题2. //text() 和 string() 对比验证:
解决方案:
- xpath(‘//div//text()’):div节点下所有子孙节点的内容;
- xpath(‘string(//div)’):div节点下所有子孙节点的内容;