喜马拉雅
火狐狸
火狐狸
  • UID55837
  • 注册日期2017-07-22
  • 最后登录2024-01-21
  • 发帖数99
  • 经验112枚
  • 威望0点
  • 贡献值90点
  • 好评度6点
  • 社区居民
  • 忠实会员
阅读:2916回复:6

[已解决] 请教一句 document.evaluate 的写法

楼主#
更多 发布于:2018-02-12 13:22
测试页面:https://www.firefox.net.cn/index.php?m=3g

用Chrome下的Xpather调试,语法明明是正确的:


但偏偏console里总是报错,愣是没看出,哪里写错了:


test = document.evaluate('//td[@class="subject"][p[@class="info"]/contains(., "楼主:fang5566")]', document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);

哪位前辈朋友,提点一下?谢谢^_^
focral
小狐狸
小狐狸
  • UID55883
  • 注册日期2017-08-14
  • 最后登录2018-02-13
  • 发帖数4
  • 经验5枚
  • 威望0点
  • 贡献值4点
  • 好评度1点
1楼#
发布于:2018-02-12 16:58
xpath还能像楼主这样写吗
我只会下面这种写法
//td[@class="subject"]/p[@class="info"][contains(.,"fang5566")]
focral
小狐狸
小狐狸
  • UID55883
  • 注册日期2017-08-14
  • 最后登录2018-02-13
  • 发帖数4
  • 经验5枚
  • 威望0点
  • 贡献值4点
  • 好评度1点
2楼#
发布于:2018-02-12 17:29
哦,我看懂了,楼主要的是.subject的集合
那这样写
//td[@class="subject"]/p[@class="info"][contains(., "楼主:fang5566")]/..
或者//p[@class="info"][contains(., "楼主:fang5566")][parent::td[@class="subject"]]/..
喜马拉雅
火狐狸
火狐狸
  • UID55837
  • 注册日期2017-07-22
  • 最后登录2024-01-21
  • 发帖数99
  • 经验112枚
  • 威望0点
  • 贡献值90点
  • 好评度6点
  • 社区居民
  • 忠实会员
3楼#
发布于:2018-02-12 23:06
focral:哦,我看懂了,楼主要的是.subject的集合
那这样写
//td[@class="subject"]/p[@class="info"]/..
或者//p[@class="info"]]/..
回到原帖
谢谢,第一次见/..写到最后的,还可以上溯,前辈这种写法,好理解多了。感谢!
focral
小狐狸
小狐狸
  • UID55883
  • 注册日期2017-08-14
  • 最后登录2018-02-13
  • 发帖数4
  • 经验5枚
  • 威望0点
  • 贡献值4点
  • 好评度1点
4楼#
发布于:2018-02-13 09:42
喜马拉雅:谢谢,第一次见/..写到最后的,还可以上溯,前辈这种写法,好理解多了。感谢!回到原帖
昨晚去查了资料,原来xpath是可以像楼主这样写的。
但是格式如下:
//td[@class="subject"][contains(p[@class="info"]/., "楼主:fang5566")]
myhead
火狐狸
火狐狸
  • UID46565
  • 注册日期2014-07-04
  • 最后登录2020-04-14
  • 发帖数107
  • 经验92枚
  • 威望0点
  • 贡献值20点
  • 好评度8点
5楼#
发布于:2018-02-13 13:19
语法错误是因为 contains 函数不能作为 node test 使用。见:
https://www.w3.org/TR/xpath/#node-tests


'//td[@class="subject"][p[@class="info"]/contains(., "楼主:fang5566")]'
改为
'//td[@class="subject"][p[@class="info"][contains(., "楼主:fang5566")]]'

'//td[@class="subject"][p[@class="info"]/.[contains(., "楼主:fang5566")]]'
则语法正确。

而语义更清晰的写法,如四楼提到的,为:
'//td[@class="subject"][contains(p[@class="info"], "楼主:fang5566")]'

'//td[@class="subject"]/p[@class="info"][contains(., "楼主:fang5566")]/..'
喜马拉雅
火狐狸
火狐狸
  • UID55837
  • 注册日期2017-07-22
  • 最后登录2024-01-21
  • 发帖数99
  • 经验112枚
  • 威望0点
  • 贡献值90点
  • 好评度6点
  • 社区居民
  • 忠实会员
6楼#
发布于:2018-02-13 14:32
myhead:语法错误是因为 contains 函数不能作为 node test 使用。见:
https://www.w3.org/TR/xpath/#node-tests


'//td[@class="subject"]/contains(...
回到原帖
原来还有node test的说法,什么时候用/什么时候用[],我老是分不清楚,谢谢前辈指点!
游客

返回顶部