0

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関数を使用したいです(私はそれがより速いと思います)。

4

2 に答える 2

0

この式//a[@class='someclass']/number()は XPath 2.0 では有効ですが、XPath 1.0 では有効ではありません。そのため、その構文を使用する場合は、Java アプリケーションが Saxon 9 のような XPath 2.0 エンジンにプラグインされていることを確認する必要があります。しかし、あなたが使用している API ( などgetByXPath) が XPath 2.0 を念頭に置いて設計されており、たとえば一連の値を返すことができるとは思えません。JAXP では、Xalan の代わりに Saxon をプラグインできますが、その API ではプリミティブ値のシーケンスを返すことはできません。

そのため、多くの場合、XPath エンジン以外にも変更が必要になります。

于 2013-09-08T14:08:15.310 に答える