Frage

Ich frage mich derzeit, wie man mit Fragmentidentitäten umgeht, ein Link, von dem ich Informationen holen möchte, enthält eine Fragmentidentität. Es scheint, als würde Htmlunit den "#/db4mj" meiner URL verwöhnen und daher die ursprüngliche URL laden.

Kennt jemand eine Möglichkeit, mit Fragmentidentitäten umzugehen? (Ich kann ein Beispielcode veröffentlichen, um bei Bedarf weiter zu erklären)

BEARBEITEN

Da ich nicht viele Ansichten bekam (und keine Antworten), werde ich eine Prämie hinzufügen. Entschuldigung, es ist nur 50, aber ich hatte erst 79 Uhr mit zunehmend

BEARBEITEN

Hier ist ein Beispielcode wie angefordert.

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

Wenn Sie sich also den Inhalt im Link ansehen, sehen Sie mehrere Pinsel, die auch URLs enthalten. Also greift mein Drehbuch die URL: http://browse.deviantart.com/resources/applications/psbrushes/order=9&offset=0#/dbwam4

Wie Sie sehen können, gibt es die Fragmentkennung #/dbwam4 Jetzt versuche ich, den Inhalt auf dieser Seite zu schnappen, aber Htmlunit glaubt immer noch, dass er sich auf der ursprünglichen URL befindet.

Hier ist ein Beispielcode in meinem Skript, in dem er in der 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 gehe davon aus, dass ich in der Lage bin, bestimmte Informationen aus der URL mit dem Fragment -Kennung zu holen, kann aber überhaupt nicht darauf zugreifen.

War es hilfreich?

Lösung

Es gibt gute Nachrichten und schlechte Nachrichten.

Erstens ist die gute Nachricht, dass HTMLUNIT gut zu funktionieren scheint.

Wenn Sie besuchen Die Seite mit der Fragment -Identier -URL in einem Browser mit ausgeschaltetem JavaScript (möglicherweise verwendet Firefoxs Quickjava -Plugin), Sie werden die gewünschte "Single -Pinsel -Ansicht" nicht sehen.

Um diese Seite zu erwerben, müssen Sie WebClient mit setjavascriptenabled auf True verwenden.

Und jetzt die schlechten Nachrichten:

Ich konnte die Seite "Single Pinsel View" mithilfe von HTMLUNIT mit JavaScript nicht eingeschaltet erwerben (ich weiß nicht warum). Obwohl ich gelegentlich die volle Seite erwerben konnte.

Das eigentliche Problem ist der Zustand der zurückgegebenen HTML ist so schlecht, dass sie meinen Versuchen, es zu analysieren TagSoup, JSOUP, Jaxen, etc). Ich vermute daher, dass es für Sie möglicherweise nicht funktioniert, die Seite mit XPath zu analysieren.

Ich würde daher denken, dass Sie auf regelmäßige Ausdrücke zurückgreifen müssen (was alles andere als ideal ist) oder sogar eine Variante von String.Indexof ("GMI-ResviewSizer_Img").

Ich hoffe das hilft.

BEARBEITEN

Ich habe es geschafft, etwas zu bekommen, das sporadisch funktioniert. Ich fürchte, ich werde noch nicht in Groovy umgewandelt, also wird es in einfachem Java sein.

Ich habe die Quelle von HTMLunit nicht angesehen, aber es ist fast so, als ob etwas beim Ausführen der Save dazu beiträgt, dass die Parsen funktioniert? Ohne den Speichern scheine ich NullPointerexceptions zu bekommen.

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

    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top