3

HtmlUnit を使用してサイトをナビゲートしています。ダウンロードするドキュメントのリストを含むテーブルがあります。すべてのリンクをクリックして、すべてのドキュメントを収集したい (心配しないでください。情報は公開されており、スクレイピングは禁止されていません)。

このサイトは 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())

ただし、問題があります。最初のドキュメントは正しくダウンロードされます。しかし、2 つ目以降は取得できません。PDF ドキュメントではなく、html ページが返されます。(コメントアウトし# -> javascript:void(0)ても効果はありません。一部の例外を除いて爆発することがあったため、そこに入れました)

Javascript が有効になっており、最初のドキュメントで Javascript が機能するようになったということは、一般的に機能していることを意味します。ただし、次のドキュメントでは機能しません。解決方法はありますか?

4

2 に答える 2

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

}

しかし、それは正しい方法ではありません...

于 2013-08-11T16:37:40.377 に答える