有好消息也有坏消息。
首先,好消息是 HtmlUnit 似乎工作得很好。
如果您在关闭 JavaScript 的浏览器中访问带有片段标识符 URL 的页面(可能使用Firefox 的 QuickJava 插件),您将看不到您想要的“单刷视图”。
因此,为了获取此页面,您需要使用 WebClient 并将 setJavaScriptEnabled 设置为 true。
现在是坏消息:
我一直无法在打开 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());
}
}