良いニュースと悪いニュースがあります。
まず、良いニュースは、HtmlUnitが正常に機能しているように見えることです。
JavaScriptがオフになっているブラウザ(FirefoxのQuickJavaプラグインを使用している可能性があります)でフラグメント識別子のURLを使用してページにアクセスすると、必要な「単一のブラシビュー」が表示されません。
したがって、このページを取得するには、setJavaScriptEnabledをtrueに設定してWebClientを使用する必要があります。
そして今、悪いニュース:
JavaScriptをオンにしてHtmlUnitを使用して「シングルブラシビュー」ページを一貫して取得できませんでした(理由はわかりません)。とはいえ、たまに全ページを取得することができました。
本当の問題は、返されたHTMLの状態が非常に悪いため、それを解析しようとする試みに逆らうことです(TagSoup、jsoup、Jaxenなどを試しました)。したがって、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());
}
}