4

特定の要素に関連する XPath 式を評価したいと思います。

私はここで読んでいます: http://www.w3schools.com/xpath/default.asp

そして、以下の構文の1つが機能するはずです(特に、先頭のスラッシュや子孫はありません:)

ただし、HTMLUnit では動作しないようです。どんな助けでも大歓迎です(ああ、これはグルーヴィーなスクリプトです)。ありがとうございました!

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

どうもありがとう。どうやら私のエラーは、子孫の後に2つではなく1つのセミコロンを使用していたようです(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 に答える