0

WATIJ を使用してスクリーン スクレイピングを行っていますが、HTML テーブルを読み取ることができません (NullPointerExceptions または UnknownObjectExceptions をスローします)。これを克服するために、HTML を読み取り、それを JTidy で実行して整形式の XML を取得します。

XPathで解析したいのですが、テーブルがXMLプレーンにあるのに<table ...>byが見つかりません。idこれが私のコードです:

XPathFactory factory=XPathFactory.newInstance();  
XPath xPath=factory.newXPath();  
InputSource inputSource = new InputSource(new StringReader(tidyHtml));  
XPathExpression xPathExpression=xPath.compile("//table[@id='searchResult']");  
String expression = "//table[@id='searchResult']";
String table = xPath.evaluate(expression, inputSource);
System.out.println("table = " + table);

テーブルは空の文字列です。

ただし、テーブルは XML にあります。tidyHtml文字列を印刷すると、表示されます

 <table
   class="ApptableDisplayTag"
   id="searchResult"
   style="WIDTH: 99%">

これまで XPath を使用したことがないため、何か不足している可能性があります。

誰でも私を正すことができますか?ありがとう。

4

7 に答える 7

2

JTidy については何も知りませんが、WATIJ については、NullPointer 例外と UnknownObject 例外が発生する理由は、XPATH が小文字のノードを使用しているためだと思います。WATIJ でテーブルを検索するための xpath として "//table[@id='searchResult']" を使用しているとします。「テーブル」は小文字であるため、実際には機能しません。WATIJ の場合、すべてのノード名を大文字にする必要があります (例: "//TABLE[@id='searchResult']")。例として、WATIJ を使用してそのテーブルの行数を出力したい場合は、次のようにします。

import watij.runtime.ie.IE;
import static watij.finders.SymbolFactory.*;

パブリック クラスの例 {
    public static void main(String[] args) {
        IE ie = 新しい IE();
        ie.start("your_url_goes_here");
        System.out.println(ie.table(xpath, "//TABLE[@id='searchResult']").rowCount());
        つまり、閉じる();
    }
}

今日 WATIJ を使い始めたばかりなので、このコードまたは回答は正しくない可能性があります。xpathsでこれとまったく同じ問題に遭遇しましたが。このページですべての xpath がどのように分類されているかに気付くまでに、数時間の検索/テストが必要でした: WATIJユーザー ガイド.

于 2009-08-31T20:39:53.593 に答える
0

私はJavaのXPathAPIを直接使用したことはなく、常にdom4jまたは他の言語(PerlおよびC)で使用していました。しかし、私はそれがどのように正常に機能するかについてよく理解しています。最初は、おそらく入力をDOMドキュメントとして解析する必要があります。これは、非常に役立ちます。また、ドキュメントにIDがあることがわかっている場合は、この方法でドキュメントを記述したDTDまたはスキーマをロードして解析する必要があります。XMLパーサーは、適切なIDを持つノードをマークして識別します。これを実行すると、DOMツリーでコードを使用できるようになります。

[XPath.evaluate(expression、item)](http://java.sun.com/j2se/1.5.0/docs/api/javax/xml/xpath/XPath.html#evaluate(java.lang。 String、%20java.lang.Object)は、2番目の要素がNodeまたはNodeListであることを示しています。これが、UnknownObjectExceptionsがたくさんある理由です。

XMLパーサーがID要素を認識できる場合は、次のXPath式を使用してIDを持つ要素にアクセスできます。

XPathExpression xPathExpression=xPath.compile("id('searchResult')");
xPathExpression.evaluate(document); // document is a DOM document instance

XPath関数id()を使用することは、要素にアクセスするための最も効率的な方法です。つまり、要素がIDを使用していて、DTDまたはスキーマでそのように宣言されている場合です。

于 2009-05-18T04:54:04.327 に答える
0

youe xPathは正しいです...失敗しているものが何であれ、そうではありません。

于 2009-05-18T04:54:35.590 に答える
0

問題は主にJTidyにあるようです。次の手順を実行することで、xpathにJTidy-iedの結果を解析させることができます。

すべての「<&amp>nbsp;」を削除します。JTidyは「<&amp>nbsp;」でxhtmlを返します タグの外側。Inタグを削除しますxmlns=...属性を削除します「head」タグを削除します。(適切に入力するとHTMLエンティティが表示されないため、面白いフォーマットを使用します)

JTidyは、...要素の場合、テキストコンテンツの中央に改行も配置します。

他のHTML->XML変換オプションを確認する必要があります。Cobraを簡単に試してみましたが、Idでテーブルを見つけることもできませんでした。Cobraからの結果を手動でクリーンアップしようとしたことがないので、JTidyと比較してどうなるかわかりません。

優れたXMLを返すHTMLパーサーをご存知の場合はお知らせください。

于 2009-05-19T15:11:32.497 に答える
0

二重引用符は絶対に必要ではなく、大文字も必要ありません。名前空間および/またはDTDが答えである可能性が高くなります。

于 2009-11-10T00:46:24.800 に答える
0

解決策は、WATIJ をやめて Google WebDriver に切り替えることでした。WebDriver は、さまざまなブラウザーが xpath ステートメントで大文字と小文字をどのように処理するかを文書化しています。

于 2009-08-31T20:53:45.127 に答える
0

Uniue ID 属性には id( ) メソッドでアクセスする必要がありますid('search')

于 2010-04-06T07:23:08.427 に答える