2013-08-11 3 views
2

Я просматриваю сайт с помощью HtmlUnit. В нем есть таблица со списком документа для загрузки. Я хочу щелкнуть все ссылки и собрать все документы (не волнуйтесь, информация общедоступна, а скребок не запрещен).Загрузка нескольких файлов на страницу с помощью HtmlUnit

site написан с JSF, так что ссылки на документы, на самом деле <a href="#" с onclick, которая представляет форму (но задает скрытое поле соответствующего значения и до этого).

Мой код (в Скале, но это не имеет значения):

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

Если я правильно помню, то внутреннее состояние водителя, если изменения u перейдите по ссылке link.click(). Поэтому вам нужно вернуться к исходной странице. – d0x

+0

Я также пробовал это, вызывая htmlPage.getEnclosingWindow(). GetHistory(). Back() - no effect – Bozho

+0

Чтобы сообщить нам, какая страница, которую вы хотите сканировать, не является опцией? – d0x

ответ

2

Я также не могу сделать это без использования pagereload. Я думаю, что трюк состоит в том, чтобы просто выполнить JavaScript из атрибута onclick().

Это один:

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"); 
    } 

} 

Но это еще не правильный способ сделать это ...

+0

ах, приятно. Я попробую это сразу – Bozho

+0

nope, все равно то же самое :( Я не использовал последнюю строку, потому что я не могу легко переназначить атрибут страницы, но я попробовал повторно запросить (а также обновить) страница, без везения – Bozho

+0

, но ваш код работает изолированно, что нечетно, поэтому я попытаюсь выяснить, в чем разница. Спасибо. – Bozho

0

Это работает для меня после каждой загрузки:

page = (HtmlPage) page.refresh(); 
Смежные вопросы