4

我想评估对于给定元素的 XPath 表达式。

我一直在这里阅读:http: //www.w3schools.com/xpath/default.asp

看起来下面的语法之一应该可以工作(尤其是没有前导斜杠或后代:)

但是,似乎没有一个在 HTMLUnit 中起作用。非常感谢任何帮助(哦,顺便说一句,这是一个 groovy 脚本)。谢谢!

http://htmlunit.sourceforge.net/

http://groovy.codehaus.org/

米莎


#!/usr/bin/env groovy

import com.gargoylesoftware.htmlunit.WebClient

def html="""
<html><head><title>Test</title></head>
<body>
<div class='levelone'>
 <div class='leveltwo'>
    <div class='levelthree' />
 </div>
 <div class='leveltwo'>
    <div class='levelthree' />
    <div class='levelthree' />
 </div>
</div>

</body>
</html>
"""

def f=new File('/tmp/test.html')
if (f.exists()) {
 f.delete()
}
def fos=new FileOutputStream(f)
fos<<html

def webClient=new WebClient()
def page=webClient.getPage('file:///tmp/test.html')

def element=page.getByXPath("//div[@class='levelone']")
assert element.size()==1
element=page.getByXPath("div[@class='levelone']")
assert element.size()==0
element=page.getByXPath("/div[@class='levelone']")
assert element.size()==0
element=page.getByXPath("descendant:div[@class='levelone']") // this
gives namespace error
assert element.size()==0

谢谢!!!

4

2 回答 2

2

从问题的定义中并不清楚,XPath 表达式相对于哪个元素求值。假设这是文档节点,那么以下 XPath 表达式将选择所需的节点:

   */*/div[@class='levelone']

   html/body/div[@class='levelone']

   descendant::div[@class='levelone']

如果在实际的 XML 文档(未显示)中存在默认名称空间,您可能会遇到问题。在这种情况下,您需要在您的 XPath 托管语言(我不知道 groovy)中定义/注册此命名空间并使用相关的前缀,如下所示:

   */*/x:div[@class='levelone']

   x:html/x:body/x:div[@class='levelone']

   descendant::x:div[@class='levelone']
于 2010-06-05T15:02:08.790 回答
0

太感谢了。显然我的错误是在后代之后使用一个分号而不是两个(doh)

#!/usr/bin/env groovy

import com.gargoylesoftware.htmlunit.WebClient

def html="""
<html><head><title>Test</title></head>
<body>
<div class='levelone'>
  <div class='leveltwo'>
     <div class='levelthree' />
  </div>
  <div class='leveltwo'>
     <div class='levelthree' />
     <div class='levelthree' />
  </div>
</div>

</body>
</html>
"""

def f=new File('/tmp/test.html')
if (f.exists()) {
  f.delete()
}
def fos=new FileOutputStream(f)
fos<<html

def webClient=new WebClient()
def page=webClient.getPage('file:///tmp/test.html')

def element=page.getByXPath("//div[@class='levelone']")
assert element.size()==1
element=page.getByXPath("div[@class='levelone']")
assert element.size()==0
element=page.getByXPath("/div[@class='levelone']")
assert element.size()==0
element=page.getByXPath("descendant::div[@class='levelone']")
assert element.size()==1

嗬!

谢谢!

米莎

于 2010-06-05T22:06:02.987 回答