1

現在、JTidyを使用してHTMLドキュメントを解析し、指定されたHTMLドキュメント内のすべてのアンカータグのコレクションをフェッチしています。次に、各タグのhref属性の値を抽出して、ページ上のリンクのコレクションを作成します。

残念ながら、これらのリンクはいくつかの異なる方法で表現できます。いくつかの絶対的な(http://www.example.com/page.html)、いくつかの相対的な( /page.html、、、page.htmlまたは../page.html)。さらに、一部は単なるアンカー(#paragraphA)になります。ブラウザで自分のページにアクセスすると、リンクをクリックした場合にこれらのさまざまなhref値を処理する方法が自動的に認識されますが、プログラムでHTTPClientを使用してJTidyから取得したこれらのリンクのいずれかをたどる場合は、最初に提供する必要があります有効なURL(たとえば、最初に/page.html、page.html、およびhttp://www.example.com/page.htmlhttp://www.example.com/page.htmlに変換する必要があります) 。

JTidyであろうと他の場所であろうと、これを実現できる組み込み機能はありますか?または、これらの異なるURLを絶対URLに変換するために、独自のルールを作成する必要がありますか?

4

2 に答える 2

3

バニラURLクラスは、使用するコンテキストを理解できると仮定すると、ほとんどの方法でそこに到達する可能性があります。ここではいくつかの例を示します。

package grimbo.url;

import java.net.MalformedURLException;
import java.net.URL;

public class TestURL {
    public static void main(String[] args) {
        // context1
        URL c1 = u(null, "http://www.example.com/page.html");
        u(c1, "http://www.example.com/page.html");
        u(c1, "/page.html");
        u(c1, "page.html");
        u(c1, "../page.html");
        u(c1, "#paragraphA");

        System.out.println();

        // context2
        URL c2 = u(null, "http://www.example.com/path/to/page.html");
        u(c2, "http://www.example.com/page.html");
        u(c2, "/page.html");
        u(c2, "page.html");
        u(c2, "../page.html");
        u(c2, "#paragraphA");
    }

    public static URL u(URL context, String url) {
        try {
            URL u = null != context ? new URL(context, url) : new URL(url);
            System.out.println(u);
            return u;
        } catch (MalformedURLException e) {
            e.printStackTrace();
            return null;
        }
    }
}

結果:

http://www.example.com/page.html
http://www.example.com/page.html
http://www.example.com/page.html
http://www.example.com/page.html
http://www.example.com/../page.html
http://www.example.com/page.html#paragraphA

http://www.example.com/path/to/page.html
http://www.example.com/page.html
http://www.example.com/page.html
http://www.example.com/path/to/page.html
http://www.example.com/path/page.html
http://www.example.com/path/to/page.html#paragraphA

ご覧のとおり、希望どおりでない結果がいくつかあります。したがって、最初にURLを解析してみてnew URL(value)、その結果がMalformedURLExceptionコンテキストURLに関連する場合は。

于 2011-12-20T00:16:06.943 に答える
1

HTML仕様で概説されているように、最善の方法は、ブラウザーと同じ解決プロセスに従う可能性が最も高いです。

ユーザーエージェントは、次の優先順位(最高の優先順位から最低の優先順位)に従ってベースURIを計算する必要があります。

  1. ベースURIはBASE要素によって設定されます。
  2. ベースURIは、HTTPヘッダーなどのプロトコル相互作用中に検出されたメタデータによって提供されます([RFC2616]を参照)。
  3. デフォルトでは、ベースURIは現在のドキュメントのURIです。すべてのHTMLドキュメントにベースURIがあるわけではありません(たとえば、有効なHTMLドキュメントが電子メールに表示され、URIで指定されていない場合があります)。このようなHTMLドキュメントは、相対URIを含み、デフォルトのベースURIに依存している場合、エラーと見なされます。

実際には、おそらく1番と2番に最も関心があります(つまり、をチェックして、<base href="..."それ(存在する場合)または現在のドキュメントのURIのいずれかを使用します)。

于 2011-12-19T23:57:43.670 に答える