Идентификаторы HtmlUnit и фрагментов

В настоящее время мне интересно, как обращаться с идентификаторами фрагментов, ссылка, из которой я хочу получить информацию, содержит идентификатор фрагмента. Кажется, что HtmlUnit отбрасывает «#/db4mj» моего URL-адреса и, следовательно, загружает исходный URL-адрес.

Кто-нибудь знает способ борьбы с фрагментами идентичности? (Я могу опубликовать пример кода для дальнейшего объяснения, если это необходимо)

ИЗМЕНИТЬ

Поскольку у меня не было много просмотров (и ответов), я собираюсь добавить награду. Извините, что только 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-адреса с идентификатором фрагмента, но не могу получить к нему доступ вообще.


person StartingGroovy    schedule 03.01.2011    source источник
comment
Пример кода был бы очень полезен и объясняет, что вы ожидаете от него. Я быстро просмотрел код HtmlUnit, и WebRequest, похоже, поддерживает идентификаторы фрагментов.   -  person Mark McLaren    schedule 11.01.2011
comment
Добавлено еще несколько объяснений и пример кода для вас. Я частично обсудил это с членом ранее, но не пришел к выводу. Если вышеизложенное обсуждается недостаточно хорошо, возможно, это находится по адресу: stackoverflow .com/questions/4320179/   -  person StartingGroovy    schedule 11.01.2011


Ответы (1)


Есть хорошие новости и плохие новости.

Во-первых, хорошая новость заключается в том, что HtmlUnit работает нормально.

Если вы посещаете страницу с URL-адресом идентификатора фрагмента в браузере с отключенным JavaScript (возможно, с помощью плагина QuickJava для Firefox ), вы не увидите «представление с одной кистью», которое вам нужно.

Поэтому, чтобы получить эту страницу, вам нужно использовать WebClient с установленным для setJavaScriptEnabled значением true.

А теперь плохие новости:

Мне не всегда удавалось получить страницу «просмотр одной кисти» с помощью HtmlUnit с включенным JavaScript (я не знаю, почему). Хотя иногда мне удавалось получить полную страницу.

Настоящая проблема заключается в том, что состояние возвращенного HTML настолько плохое, что я не могу его проанализировать (я пробовал TagSoup, jsoup, Яксен и т. д.). Поэтому я подозреваю, что попытка проанализировать страницу с помощью 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());

    }
}
person Mark McLaren    schedule 12.01.2011
comment
Но регулярные выражения? Ужас! - person TrueWill; 12.01.2011
comment
Спасибо, что заглянули, Марк. Я собираюсь оставить вопрос открытым до завтра, если у кого-то еще есть идеи по этому поводу. Глядя на усилия, которые вы приложили к этому; Я думаю, вы правы. Когда вы просмотрели его, смогли ли вы найти какую-либо другую информацию на странице просмотра одной кисти? (название, ссылка для скачивания и т. д.) Я собираюсь включить javascript и осмотреться. (Всякий раз, когда я включаю его, мое окно раздувается трудночитаемой информацией) - person StartingGroovy; 13.01.2011