Es gibt gute Nachrichten y schlechte Nachrichten .
Die erste gute Nachricht ist, dass HtmlUnit anscheinend gut funktioniert.
Wenn Sie besuchen die Seite mit der Fragmentidentifizierungs-URL in einem Browser mit ausgeschaltetem JavaScript (vielleicht mit Das QuickJava-Plugin von Firefox ), werden Sie nicht die gewünschte "Einzelpinselansicht" sehen.
Um diese Seite zu erhalten, müssen Sie den WebClient mit setJavaScriptEnabled auf true setzen.
Und nun die schlechte Nachricht:
Ich war nicht immer in der Lage, die Seite "Single Brush View" mit HtmlUnit bei aktiviertem JavaScript zu erfassen (ich weiß nicht, warum). Obwohl, ich habe in der Lage, die ganze Seite bei Gelegenheit zu erwerben.
Das eigentliche Problem ist, dass der Zustand des zurückgegebenen HTML so schlecht ist, dass er meinen Versuchen, ihn zu parsen, widerspricht (ich habe versucht TagSuppe , jsoup , Jaxen , etc). Ich vermute daher, dass der Versuch, die Seite mit XPath zu analysieren, bei Ihnen nicht funktionieren wird.
Ich würde daher denken, dass Sie auf die Verwendung von regulären Ausdrücken zurückgreifen müssen (was alles andere als ideal ist) oder sogar eine Variante von String.indexOf("gmi-ResViewSizer_img") verwenden.
Ich hoffe, das hilft.
エディテージ
Es ist mir gelungen, etwas zu finden, das sporadisch funktioniert. Ich fürchte, ich bin noch nicht zu Groovy konvertiert, so wird es in plain old Java sein.
Ich habe mir den Quellcode von HtmlUnit nicht angeschaut, aber es ist fast so, als ob irgendetwas im Prozess des Speicherns dazu beiträgt, dass das Parsing funktioniert? Ohne das Speichern scheine ich NullPointerExceptions zu erhalten.
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());
}
}