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 -адреса с идентификатором фрагмента, но я не могу получить к нему доступ.
Решение
Есть хорошие новости а также плохие новости.
Во -первых, хорошая новость заключается в том, что 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());
}
}