4

私は現在、フラグメントIDを処理する方法を考えています。これは、情報を取得したいリンクであり、フラグメントIDが含まれています。HtmlUnitが私のURLの「#/ db4mj」を破棄しているように見えるため、元のURLを読み込んでいます。

フラグメントIDを処理する方法を知っている人はいますか?(必要に応じて、サンプルコードを投稿してさらに説明することができます)

編集

あまり多くの意見が得られなかった(そして答えがなかった)ので、賞金を追加します。申し訳ありませんが、50だけですが、最初は79しかありませんでした

編集

リクエストに応じたサンプルコードを次に示します。

URLは次のようになります: http: //browse.deviantart.com/resources/applications/psbrushes/?order = 9&offset = 0

したがって、リンクのコンテンツを見ると、URLを含む複数のブラシも表示されます。だから私のスクリプトはURLを取得します:http: //browse.deviantart.com/resources/applications/psbrushes/?order = 9&offset = 0#/ dbwam4

ご覧のとおり、フラグメント識別子#/ dbwam4があります。ここで、このページにあるコンテンツを取得しようとしましたが、HtmlUnitはそれが元のURLにあると見なします。

これは私のスクリプトのサンプルコードで、フラグメント識別子のURLで失敗しますが、元のURLでは問題ありません。

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

page = client.getPage(url)       //url with fragment identifier

//this is on the url with the fragment identifier only, not the original url
img = page.getByXPath("*[@id="gmi-ResViewSizer_img"]")

フラグメント識別子を使用してURLから特定の情報を取得できると期待していますが、アクセスできません。

4

1 に答える 1

1

良いニュース悪いニュースがあります。

まず、良いニュースは、HtmlUnitが正常に機能しているように見えることです。

JavaScriptがオフになっているブラウザ(FirefoxのQuickJavaプラグインを使用している可能性があります)でフラグメント識別子のURLを使用してページにアクセスすると、必要な「単一のブラシビュー」が表示されません。

したがって、このページを取得するには、setJavaScriptEnabledをtrueに設定してWebClientを使用する必要があります。

そして今、悪いニュース:

JavaScriptをオンにしてHtmlUnitを使用して「シングルブラシビュー」ページを一貫して取得できませんでした(理由はわかりません)。とはいえ、たまに全ページを取得することができました。

本当の問題は、返されたHTMLの状態が非常に悪いため、それを解析しようとする試みに逆らうことです(TagSoupjsoupJaxenなどを試しました)。したがって、XPathを使用してページを解析しようとするとうまくいかない可能性があります。

したがって、正規表現(理想からはほど遠い)を使用するか、String.indexOf( "gmi-ResViewSizer_img")のバリアントを使用する必要があると思います。

これがお役に立てば幸いです。

編集

私は散発的に機能するものを何とか手に入れました。まだGroovyに変換されていないので、古いJavaに変換されます。

HtmlUnitのソースを調べていませんが、保存を実行している途中の何かが解析を機能させるのに役立っているようです。保存しないと、NullPointerExceptionsが発生するようです。

import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.WebRequest;
import com.gargoylesoftware.htmlunit.WebResponse;
import com.gargoylesoftware.htmlunit.html.HtmlElement;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.gargoylesoftware.htmlunit.util.FalsifyingWebConnection;
import java.io.File;
import java.io.IOException;

public class TestProblem {

    public static void main(String[] args) throws IOException {
        WebClient client = new WebClient(BrowserVersion.FIREFOX_3_6);
        client.setJavaScriptEnabled(true);
        client.setCssEnabled(false);
        String url = "http://browse.deviantart.com/resources/applications/psbrushes/?order=9&offset=0#/dbwam4";
        client.setThrowExceptionOnScriptError(false);
        client.setThrowExceptionOnFailingStatusCode(false);
        client.setWebConnection(new FalsifyingWebConnection(client) {

            @Override
            public WebResponse getResponse(final WebRequest request) throws IOException {
                if ("www.google-analytics.com".equals(request.getUrl().getHost())) {
                    return createWebResponse(request, "", "application/javascript"); // -> empty script
                }
                if ("d.unanimis.co.uk".equals(request.getUrl().getHost())) {
                    return createWebResponse(request, "", "application/javascript"); // -> empty script
                }
                if ("edge.quantserve.com".equals(request.getUrl().getHost())) {
                    return createWebResponse(request, "", "application/javascript"); // -> empty script
                }
                if ("b.scorecardresearch.com".equals(request.getUrl().getHost())) {
                    return createWebResponse(request, "", "application/javascript"); // -> empty script
                }
                //
                if (request.getUrl().toString().startsWith("http://st.deviantart.net/css/v6core_jc.js")) {
                    WebResponse wr = super.getResponse(request);
                    return createWebResponse(request, wr.getContentAsString(), "application/javascript");
                }
                if (request.getUrl().toString().startsWith("http://st.deviantart.net/css/v6loggedin_jc.js")) {
                    WebResponse wr = super.getResponse(request);
                    return createWebResponse(request, wr.getContentAsString(), "application/javascript");
                }
                return super.getResponse(request);
            }
        });

        HtmlPage page = client.getPage(url);       //url with fragment identifier



        File saveFile = new File("saved.html");
        if(saveFile.exists()){
            saveFile.delete();
            saveFile = new File("saved.html");
        }
        page.save(saveFile);


        HtmlElement img = page.getElementById("gmi-ResViewSizer_img");
        System.out.println(img.toString());

    }
}
于 2011-01-12T13:54:44.883 に答える