【干货】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节点下所有子孙节点的内容;

posted @ 2017-07-26 17:59  吴昭  阅读(91)  评论(0编辑  收藏  举报