我正在使用HtmlUnit浏览网站。 它有一个表格,下载文件清单。我想点击所有链接并收集所有文件(不用担心,信息是公开的,不禁止抓取)。
site是用JSF编写的,因此指向文档的链接实际上是<a href="#"
,onclick
提交表单(但在此之前将隐藏字段设置为适当的值)
我的代码是(在scala中,但这没关系):
val link = row.getFirstByXPath[HtmlElement](descriptor.documentLinkPath.get)
if (link.getAttribute("href").endsWith("#")) link.setAttribute("href", "javascript:void(0)")
val documentPage: Page = link.click()
val bytes = IOUtils.toByteArray(documentPage.getWebResponse().getContentAsStream())
然而,有一个问题。正确下载第一个文档。但我无法获得第二个及以后 - 返回html页面,而不是PDF文档。 (注释掉# -> javascript:void(0)
没有任何效果,我把它放在那里因为它曾经爆炸了一些例外)
Javascript已启用并使其适用于第一个文档意味着事情通常正常。但是,它不适用于下一个文档。任何想法如何解决?
答案 0 :(得分:2)
如果没有网页重播,我也无法做到这一点。我认为诀窍就是从onclick()
属性上执行JavaScript。
这一个:
return oamSubmitForm('broi_form','broi_form:dataTable1:4:_idJsp110',null,[['id_','3545']]);');
也许这有助于你。
public static void main(String[] args) throws FailingHttpStatusCodeException, MalformedURLException, IOException
{
final WebClient webClient = new WebClient();
HtmlPage page = webClient.getPage("http://dv.parliament.bg/DVWeb/broeveList.faces");
for (HtmlAnchor link : (List<HtmlAnchor>) page.getByXPath("//table[@id='broi_form:dataTable1']//a/img/.."))
{
String commandString = link.getOnClickAttribute().replaceAll("return ", "");
System.out.println(commandString);
ScriptResult executeJavaScript = page.executeJavaScript(commandString);
Page newPage = executeJavaScript.getNewPage();
save(newPage.getWebResponse().getContentAsStream());
page = webClient.getPage("http://dv.parliament.bg/DVWeb/broeveList.faces");
}
}
但那不是正确的做法......
答案 1 :(得分:0)
每次下载后,这对我有用:
page = (HtmlPage) page.refresh();