Pregunta

Me pregunto actualmente cómo hacer frente a las identidades de los fragmentos, un enlace que estoy queriendo agarrar la información de, contiene un fragmento de identidad. Parece como si HtmlUnit está desechando el "# / db4mj" de mi url y por lo tanto la carga de la URL original.

¿Alguien sabe de una manera de hacer frente a las identidades de los fragmentos? (Me pueden enviar código de ejemplo para explicar aún más si es necesario)

editar

Dado que no estaba recibiendo muchos puntos de vista (y no hay respuestas), voy a añadir una recompensa. En este momento es sólo 50, pero sólo tenía 79 para comenzar con

Editar

Este es un ejemplo de código conforme a lo solicitado.

Nuestro URL será: http: //browse.deviantart. com / recursos / aplicaciones / psbrushes /? order = 9 y offset = 0

Así que si usted echa un vistazo a los contenidos en el enlace, verá varios pinceles que contienen direcciones URL también. Así que mi guión agarra la URL: http: // Examinar. deviantart.com/resources/applications/psbrushes/?order=9&offset=0#/dbwam4

Como se puede ver que es el identificador de fragmento # / dbwam4 Ahora trato y agarrar el contenido que se encuentra en esta página, pero HtmlUnit todavía piensa que está en la dirección URL original.

Aquí hay un código de ejemplo en mi guión donde se produce un error en la URL identificador de fragmento, pero no tiene problema con la URL original.

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

Estoy esperando a ser capaz de agarrar cierta información de la dirección URL con el identificador de fragmento, pero no soy capaz de acceder a él en absoluto.

¿Fue útil?

Solución

buena noticia y mala noticia .

Primero las buenas noticias es que HtmlUnit parece estar funcionando muy bien.

Si usted visita la página con la URL identier fragmento en un navegador con JavaScript desactivado (tal vez usando de Firefox QuickJava plug-in ), no verá la "vista de cepillo único" que desea.

Así que con el fin de adquirir esta página es necesario utilizar WebClient con juego setJavaScriptEnabled true.

Y ahora las malas noticias:

No he sido siempre capaz de adquirir la página "visión única pincel" usando HtmlUnit con JavaScript activado (no sé por qué). Aunque, he podido adquirir la página completa en ocasión.

El problema real es el estado del HTML devuelto es tan malo como para desafiar mis intentos de analizarlo (probé TagSoup , jsoup , Jaxen , etc). Por lo tanto sospechoso intentar analizar la página utilizando XPath puede no funcionar para usted.

Por lo tanto, sería pensar que necesita recurrir al uso de expresiones regulares (que está lejos de ser ideal) o incluso utilizar alguna variante de String.indexOf ( "GMI-ResViewSizer_img").

Espero que esto ayude.

Editar

He conseguido algo que funciona de forma esporádica. Me temo que no estoy convertido a Groovy, sin embargo, por lo que será en el viejo y simple de Java.

No he mirado en la fuente de HtmlUnit pero es casi como si algo en el proceso de ejecutar el proceso de almacenamiento está ayudando a hacer el trabajo de análisis ?? Sin el ahorro que parecen llegar 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());

    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top