Question

Je suis actuellement se demander comment traiter les identités fragment, un lien que je voulais à l'information grab à partir, contient une identité de fragment. Il semble que HtmlUnit est le rejet « # / db4mj » de mon url et le chargement par conséquent l'URL d'origine.

Quelqu'un sait-il d'une façon de traiter les identités de fragments? (Je peux poster exemple de code pour expliquer plus en détail le cas échéant)

EDIT

Depuis que je ne recevais pas beaucoup de points de vue (et pas de réponse), je vais ajouter une prime. Désolé, il est seulement 50, mais je n'avais 79 à commencer par

EDIT

Voici un exemple de code tel que demandé.

Notre URL sera: http: //browse.deviantart. com / ressources / applications / psbrushes /? order = 9 & offset = 0

Donc, si vous jetez un coup d'oeil au contenu dans le lien, vous verrez plusieurs brosses qui contiennent des URL aussi bien. Donc, mon script saisit l'URL: http: // parcourir. deviantart.com/resources/applications/psbrushes/?order=9&offset=0#/dbwam4

Comme vous pouvez le voir, il est l'identifiant de fragment # / dbwam4 Maintenant, j'essaie et de saisir le contenu qui se trouve sur cette page, mais HtmlUnit pense toujours qu'il est sur l'URL d'origine.

Voici un exemple de code dans mon script où il échoue sur l'URL d'identificateur de fragment, mais n'a pas de problème avec l'URL d'origine.

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

Je me attends à être en mesure de saisir certaines informations de l'URL avec l'identifiant de fragment, mais je suis incapable d'y accéder soit.

Était-ce utile?

La solution

Il est bonnes nouvelles et mauvaises nouvelles .

D'abord les bonnes nouvelles sont que HtmlUnit semble fonctionner très bien.

Si vous visitez la page avec l'URL fragment identier dans un navigateur avec JavaScript désactivé (en utilisant peut-être QuickJava Firefox Plugin ), vous ne verrez pas la vue « de pinceau » que vous voulez.

Ainsi, afin d'acquérir cette page, vous devez utiliser WebClient avec jeu setJavaScriptEnabled true.

Et maintenant les mauvaises nouvelles:

Je n'ai pas toujours été en mesure d'acquérir la page « vue de pinceau » à l'aide HtmlUnit avec JavaScript activé (je sais pas pourquoi). Bien que, je suis en mesure d'acquérir la pleine page sur occassion.

Le vrai problème est l'état du code HTML est retourné si mauvais à défier mes tentatives pour analyser (j'ai essayé TagSoup , jsoup , Jaxen , etc.). Je suis donc suspect essayant d'analyser la page en utilisant XPath peut ne pas fonctionner pour vous.

Je suis donc penser que vous avez besoin de recourir à l'utilisation des expressions régulières (ce qui est loin d'être idéal) ou même utiliser une variante de String.indexOf ( « GMi-ResViewSizer_img »).

J'espère que cette aide.

EDIT

J'ai réussi à obtenir quelque chose qui fonctionne de façon sporadique. Je crains que je ne suis pas converti en Groovy encore, il sera bon vieux Java.

Je ne l'ai pas regardé à la source de HtmlUnit mais il est presque comme si quelque chose dans le processus de fonctionnement de l'économie contribue à rendre le travail d'analyse syntaxique ?? Sans la sauvegarde me semble avoir 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());

    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top