Есть хорошие новости и плохие новости .
Во-первых, хорошая новость заключается в том, что HtmlUnit работает нормально.
Если вы посетите страницу с идентификатором фрагмента URL в браузере с отключенным JavaScript (возможно, с помощью плагина QuickJava для Firefox ), вы не увидите «вид одной кисти» что ты хочешь.
Таким образом, чтобы получить эту страницу, вам нужно использовать WebClient с setJavaScriptEnabled, установленным в true.
А теперь плохие новости:
Мне не всегда удавалось получить страницу «просмотра одной кистью», используя HtmlUnit с включенным JavaScript (я не знаю, почему). Хотя я иногда получал полную страницу.
Настоящая проблема в том, что состояние возвращаемого HTML настолько плохое, что не поддается попыткам его разобрать (я пытался TagSoup , jsoup , Jaxen, так далее). Поэтому я подозреваю, что попытка парсинга страницы с использованием XPath может не сработать.
Поэтому я бы подумал, что вам нужно прибегнуть к использованию регулярных выражений (что далеко от идеала) или даже использовать какой-то вариант String.indexOf ("gmi-ResViewSizer_img").
Надеюсь, это поможет.
EDIT
Мне удалось получить кое-что, что время от времени работает. Боюсь, я еще не преобразован в 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());
}
}