HTML ページ内にこれら 3 つのアンカーがあるとします。htmlunit を使用して、これらのアンカー内の数値を取得したい (テキストではなく数値として)。
<a class="someclass" href="http://someaddress1.com">3.14</a>
<a class="someclass" href="http://someaddress2.com">1.22</a>
<a class="someclass" href="http://someaddress3.com">6.66</a>
このジョブは、次の testXPath メソッドによって実行する必要があります。
public static void testXPath () {
WebClient webClient = new WebClient();
webClient.setJavaScriptEnabled(false);
webClient.setCssEnabled(false);
try {
final HtmlPage page = (HtmlPage) webClient.getPage("pageurl");
String XPath="//a[@class='someclass']/number()";
List<Object> list = (List<Object>) page.getByXPath(XPath);
for (Objects : list) {
System.out.println(s);
}
} catch (Exception e) {
e.printStackTrace();
}
}
これを実行すると、次のようになります。
java.lang.RuntimeException: Could not retrieve XPath
Caused by: javax.xml.transform.TransformerException: Unknown nodetype: number
href 値のみを (文字列として) 取得したい場合も、同じエラーが発生します。この場合 :
String XPath="//a[@class='someclass']/@href/string()";
でもいつ、
String XPath="string(//a[@class='someclass']/@href)";
最初の href 値のみを取得しますhttp://someaddress1.com
これらの数値を文字列として取得し、Double として解析できることを知っています
List<DomText> list = (List<DomText>) page.getByXPath("//a[@class='someclass']/text()");
for (DomText d : list) {
System.out.println(Double.parseDouble(list.get(i).toString()));
}
.getValue() を使用して、hrefs を取得できます
List<DomAttr> list = (List<DomAttr>) page.getByXPath("//a[@class='someclass']/@href");
for (DomAttr d : list) {
System.out.println(list.get(i).getValue());
}
しかし、そうではありません。私はそれを行うためにXPath関数を使用したいです(私はそれがより速いと思います)。