快捷导航
11 4156

xpath常用函数用法

ym 于 2016-5-27 17:46 发表 [复制链接]
本帖最后由 ym 于 2017-1-4 15:59 编辑


一、精确定位
1)contains(str1,str2)  用来判断str1是否包含str2
例1://*[contains(@class,'c-summaryc-row ')]  选择@class值中包含c-summary c-row的节点
例2://div[contains(.//text(),'价格')]  选择text()中包含价格的div节点

2)position()  选择当前的第几个节点
例1://*[@class='result'][position()=1]   选择@class='result'的第一个节点
例2://*[@class='result'][position()<=2]   选择@class='result'的前两个节点

3)last()  选择当前的倒数第几个节点
例1://*[@class='result'][last()]   选择@class='result'的最后一个节点
例2://*[@class='result'][last()-1]   选择@class='result'的倒数第二个节点

4
following-sibling 选取当前节点之后的所有同级节点
例1://div[@class='result']/following-sibling::div   选择@class='result'的div节点后所有同级div节点     找到多个节点时可通过position确定第几个如://div[@class='result']/following-sibling::div[position()=1]

5)preceding-sibling 选取当前节点之前的所有同级节点
使用方法同
following-sibling

二、过滤信息
1)substring-before(str1,str2)  用于返回字符串str1中位于第一个str2之前的部分
例子:substring-before(.//*[@class='c-more_link']/text(),'条')
返回.//*[@class='c-more_link']/text()中第一个'条'前面的部分,如果不存在'条',则返回空值

2)substring-after(str1,str2)  跟substring-before类似,返回字符串str1中位于第一个str2之后的部分
例1:substring-after(.//*[@class='c-more_link']/text(),'条')
返回.//*[@class='c-more_link']/text()中第一个’条’后面的部分,如果不存在'条',则返回空值
例2:substring-after(substring-before(.//*[@class='c-more_link']/text(),'新闻'),'条')
返回.//*[@class='c-more_link']/text()中第一个'新闻'前面与第一个'条'后面之间的部分

3)normalize-space()
用来将一个字符串的头部和尾部的空白字符删除,如果字符串中间含有多个连续的空白字符,将用一个空格来代替
例子:normalize-space(.//*[contains(@class,'c-summaryc-row ')])

4)translate(string,str1,str2)
假如string中的字符在str1中有出现,那么替换为str1对应str2的同一位置的字符,假如str2这个位置取不到字符则删除string的该字符
例子:translate('12:30','03','54')   结果:'12:45'

三、拼接信息
1)concat()  函数用于串连多个字符串
例子:concat('http://baidu.com',.//*[@class='c-more_link']/@href)

举报 使用道具
| 回复

共 11 个关于本帖的回复 最后回复于 2017-10-31 11:33

bjdfhsxxjs1 初级会员 发表于 2017-4-20 14:19:22 | 显示全部楼层
举报 使用道具
gilmechen 初级会员 发表于 2017-8-1 11:58:25 | 显示全部楼层
在抓取内容-高级设置-自定义xpath-抓取表达式中用这些函数都会报错说“为整理箱生成结果时发生异常: 消息=建议检查自定义XPath的正确性”,请问是什么问题?
比如:
<xsl:copy-of select="*//*[@class='a1wrp']/h3/a//text()"/>可以抓取整个text内容,
但<xsl:copy-of select="substring_before(*//*[@class='a1wrp']/h3/a//text(),'&')"/>这句就会报错
举报 使用道具
Fuller 管理员 发表于 2017-8-1 12:23:11 | 显示全部楼层
gilmechen 发表于 2017-8-1 11:58
在抓取内容-高级设置-自定义xpath-抓取表达式中用这些函数都会报错说“为整理箱生成结果时发生异常: 消息= ...

自定义xpath不能输入xslt的代码,只能是纯xpath
举报 使用道具
Fuller 管理员 发表于 2017-8-1 12:24:56 | 显示全部楼层
另外,substring-before函数是用中间横线,不用下划线
举报 使用道具
gilmechen 初级会员 发表于 2017-8-1 13:55:40 | 显示全部楼层
Fuller 发表于 2017-8-1 12:24
另外,substring-before函数是用中间横线,不用下划线

修改了以上问题后还是报同样的错
举报 使用道具
wangyong 版主 发表于 2017-8-1 14:06:48 | 显示全部楼层
gilmechen 发表于 2017-8-1 13:55
修改了以上问题后还是报同样的错

"&"要替换成转移符"&amp;"
举报 使用道具
gilmechen 初级会员 发表于 2017-8-1 14:19:46 | 显示全部楼层
wangyong 发表于 2017-8-1 14:06
"&"要替换成转移符"&amp;"

搞定了,谢谢!是不是在自定义xpath或者xslt时所有符号都要转义?
举报 使用道具
wangyong 版主 发表于 2017-8-1 15:22:13 | 显示全部楼层
gilmechen 发表于 2017-8-1 14:19
搞定了,谢谢!是不是在自定义xpath或者xslt时所有符号都要转义?

xpath需要转义的', "单引号和双引号
抓取结果是存在xml中同时需要考虑xml要转义的字符
XML5个转义符:<,>,&,”,©;的转义字符分别如下: &lt; &gt;&amp; &quot; &apos;
举报 使用道具
nevermove 新手上路 发表于 2017-9-7 15:28:37 | 显示全部楼层
这么复杂~~~~~~
举报 使用道具
您需要登录后才可以回帖 登录 | 立即注册

精彩推荐

  • 百度推广后台数据DIY
  • 采集表单中的input动态内容
  • 采用刷新动作实现手机页面采集
  • 通过划定滚轮范围实现精确点击手机页面
  • 放大或者缩小页面便于采集手机网页内容

热门用户

集搜客GooSeeker网络爬虫 ( 粤ICP备11065265号-2 )

GMT+8, 2017-12-14 18:05