Вопрос

В настоящее время мне интересно, как справиться с фрагментными идентификаторами, ссылкой, из которой я хочу получить информацию, содержит идентичность фрагмента. Кажется, как будто 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 -адреса с идентификатором фрагмента, но я не могу получить к нему доступ.

Это было полезно?

Решение

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

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

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

Таким образом, чтобы получить эту страницу, вам нужно использовать WebClient с SetJavascripTenabled Set в True.

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

Я не смог постоянно получать страницу «One Brush View», используя 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());

    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top