4 Stimmen

HtmlUnit- und Fragment-Identitäten

Ich frage mich gerade, wie man mit Fragment-Identitäten umgeht. Ein Link, von dem ich Informationen abrufen möchte, enthält eine Fragment-Identität. Es scheint, als ob HtmlUnit verwirft die "#/db4mj" meiner url und daher das Laden der ursprünglichen url.

Kennt jemand eine Möglichkeit, mit Fragment-Identitäten umzugehen? (Ich kann bei Bedarf Beispielcode zur weiteren Erläuterung posten)

エディテージ

Da ich nicht viele Aufrufe (und keine Antworten) bekommen habe, werde ich ein Kopfgeld aussetzen. Tut mir leid, dass es nur 50 sind, aber ich hatte nur 79, um damit anzufangen

エディテージ

Hier ist ein Beispielcode wie gewünscht.

Unsere URL wird sein: http://browse.deviantart.com/resources/applications/psbrushes/?order=9&offset=0

Wenn Sie also einen Blick auf den Inhalt des Links werfen, werden Sie mehrere Pinsel sehen, die ebenfalls URLs enthalten. Mein Skript schnappt sich also die URL: http://browse.deviantart.com/resources/applications/psbrushes/?order=9&offset=0#/dbwam4

Wie Sie sehen können, gibt es den Fragmentbezeichner #/dbwam4 Jetzt versuche ich, den Inhalt dieser Seite zu erfassen, aber HtmlUnit denkt immer noch, dass er sich auf der ursprünglichen URL befindet.

Hier ist ein Beispiel-Code in meinem Skript, wo es auf das Fragment Identifier URL fehlschlägt, aber kein Problem mit der ursprünglichen URL hat.

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"]")

Ich erwarte, dass ich bestimmte Informationen aus der URL mit dem Fragmentbezeichner abrufen kann, aber ich kann nicht darauf zugreifen.

1voto

Mark McLaren Punkte 11330

Es gibt gute Nachrichten y schlechte Nachrichten .

Die erste gute Nachricht ist, dass HtmlUnit anscheinend gut funktioniert.

Wenn Sie besuchen die Seite mit der Fragmentidentifizierungs-URL in einem Browser mit ausgeschaltetem JavaScript (vielleicht mit Das QuickJava-Plugin von Firefox ), werden Sie nicht die gewünschte "Einzelpinselansicht" sehen.

Um diese Seite zu erhalten, müssen Sie den WebClient mit setJavaScriptEnabled auf true setzen.

Und nun die schlechte Nachricht:

Ich war nicht immer in der Lage, die Seite "Single Brush View" mit HtmlUnit bei aktiviertem JavaScript zu erfassen (ich weiß nicht, warum). Obwohl, ich habe in der Lage, die ganze Seite bei Gelegenheit zu erwerben.

Das eigentliche Problem ist, dass der Zustand des zurückgegebenen HTML so schlecht ist, dass er meinen Versuchen, ihn zu parsen, widerspricht (ich habe versucht TagSuppe , jsoup , Jaxen , etc). Ich vermute daher, dass der Versuch, die Seite mit XPath zu analysieren, bei Ihnen nicht funktionieren wird.

Ich würde daher denken, dass Sie auf die Verwendung von regulären Ausdrücken zurückgreifen müssen (was alles andere als ideal ist) oder sogar eine Variante von String.indexOf("gmi-ResViewSizer_img") verwenden.

Ich hoffe, das hilft.

エディテージ

Es ist mir gelungen, etwas zu finden, das sporadisch funktioniert. Ich fürchte, ich bin noch nicht zu Groovy konvertiert, so wird es in plain old Java sein.

Ich habe mir den Quellcode von HtmlUnit nicht angeschaut, aber es ist fast so, als ob irgendetwas im Prozess des Speicherns dazu beiträgt, dass das Parsing funktioniert? Ohne das Speichern scheine ich NullPointerExceptions zu erhalten.

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());

    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X