2010-12-01 19 views
1

私はGroovyでコーディングしていますが、言語固有の質問はそれほどありません。HtmlUnit getByXpathがNULLを返します

私は実際にHtmlUnitを使用している間、私が問題に遭遇してきた二つの質問

最初の質問

を持っています。私が取ろうとしているのはヌルであると私に伝えています。

私はそれをテストしてるページがある: http://browse.deviantart.com/resources/applications/psbrushes/?order=9&offset=0#/dbwam4

マイコード:

client = new WebClient(BrowserVersion.FIREFOX_3) 
client.javaScriptEnabled = false 

page = client.getPage(url) 

//coming up as null 
title = page.getByXPath("//html/body/div[4]/div/div[3]/div/div/div/div/div/div/div/div/div/div/h1/a") 

println title 

これは単純に出力します:ページがを使用しているため[]

はこれですonclick()?もしそうなら、私はその周りにいかがですか? javascriptを有効にすると、私のcmdプロンプトに混乱が生じます。

2番目の質問私も画像を取得したいのですが、私は(放火魔経由)XPathを取得しようとすると、それはとして表示するので、トラブルを抱えてい

// * [ID @ =」 gmi-ResViewSizer_img "]

どうすれば対応できますか?

答えて

1

最初の答え:

/html/body/div[3]/div/div[3]/div/div/div/div/div/div/div/div/div/div/h1/a 

あなたのXPathは、本体の第四divのための述語フィルタに1でオフだったが、それは第三divでなければなりません。サイトのHTMLは、Firebugを使用してXPATHに伝播したときから変わる可能性があります。潜在的な変更に対応し、文書構造のいくつかの違いに敏感でないようにXPATHを調整する必要があるかもしれません。

たぶん、このような何か:

/html/body//div/h1/a 

セカンド回答:あなたが記載されたXPATHが動作します。 (imgを含むように)*は任意の要素に一致し、[]述語フィルタはそれを制限します(これは奇妙な/短く見えるかもしれませんが、最も効率的ではないかもしれませんが)//はルートノードで始まり、値が "gmi-ResViewSizer_img"に等しいid属性を持つユーザーに送信します。

XPATHには、他にも多くのオプションがあります。また、HTML構造の変更頻度にも依存します。また、これはimgことを選択するために参照されるページのために働くものです:

/html/body/div/div/div/div/img[1] 
+0

+1良い説明。 –

+0

説明をもう一度ありがとうMads Hansen :)あなたはとても役に立ちました。説明は役に立ちましたが、最初の回答のために私はまだ空の復帰を得ているようです。私はそれがH1で問題を抱えていると思う。 – StartingGroovy

+0

2番目に短いXPATHはあなたのために働くのだろうか? –

0

私は私がページ上のiframeタグを実現する場合、nは

((HtmlPage)current_page.getFrames()[n].getEnclosedPage()).getElementByXPath(... 

を呼び出してみてください解決し、同じ問題を抱えていましたiframeコレクションのフレーム内の位置。それは私の仕事です!

ありがとうございます。

+1

あなたの問題はフラグメント識別子を扱っていますか? – StartingGroovy

関連する問題