我目前想知道如何处理片段标识,我想要从中获取信息的链接,包含片段标识。似乎HtmlUnit丢弃了我的网址的“#/ db4mj”,因此加载了原始网址。
有没有人知道处理片段身份的方法? (我可以发布示例代码以进一步解释是否需要)
修改的
由于我没有获得很多观点(并且没有答案),我将添加一笔赏金。对不起它只有50,但我只有79开始
编辑
以下是请求的示例代码。
我们的网址为:http://browse.deviantart.com/resources/applications/psbrushes/?order=9&offset=0
因此,如果你看一下链接中的内容,你会看到多个包含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中获取某些信息,但无法访问它。
答案 0 :(得分:1)
好消息和坏消息。
首先,好消息是HtmlUnit似乎工作正常。
如果您在关闭JavaScript的浏览器中访问the page with the fragment identier URL(可能使用Firefox's QuickJava plugin),您将看不到所需的“单刷视图”。
因此,为了获取此页面,您需要使用WebClient并将setJavaScriptEnabled设置为true。
现在是坏消息:
我没有能够在启用JavaScript的情况下使用HtmlUnit获取“单刷视图”页面(我不知道为什么)。虽然,我已经能够获得关于场合的整页。
真正的问题是返回的HTML的状态非常糟糕,以至于无法解析我的尝试(我尝试TagSoup,jsoup,Jaxen等等。因此,我怀疑尝试使用XPath解析页面可能对您不起作用。
因此我认为您需要使用正则表达式(这远非理想),甚至使用String.indexOf(“gmi-ResViewSizer_img”)的某种变体。
我希望这会有所帮助。
修改强>
我设法得到偶尔起作用的东西。我担心我还没有转换为Groovy,所以它将是普通的旧Java。
我没有看过HtmlUnit的源代码,但几乎就好像在运行save的过程中有什么东西有助于解析工作?如果没有保存,我似乎得到了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());
}
}