このWebページからデータを取得しようとしています:http ://www.atm-mi.it/en/Giromilano/Pages/default.aspx 。基本的に、私はJavaでHtmlUnitを使用して、左の列の中央にある「ルートと時刻表のファインダー」と対話し、選択の各オプションをループして、「検索」をクリックし、結果のページから必要なデータを収集しています。
都市ルートのデータを抽出するのに問題はありませんが、上のラジオボタンを処理できないようです。たとえば、ブラウザで[地下]をクリックすると、下の選択でさまざまなオプションを含む新しいページが表示されます。
しかし、私は以前と同じSelectを取得し続けます。もっと正確に言うと、私は同じページを取得し続けます(page2はpageと同じHTMLコードを持っています)。
明らかに、.click()関数で問題が発生しているはずですが、どうでしょうか。
これは私のコードの単純なバージョンです:
WebClient webClient = new WebClient(BrowserVersion.FIREFOX_3_6);
webClient.setThrowExceptionOnScriptError(false);
HtmlPage page = webClient.getPage("http://www.atm-mi.it/en/Giromilano/Pages/default.aspx");
HtmlRadioButtonInput radioButton2 = (HtmlRadioButtonInput) page.getElementById("ctl00_SPWebPartManager1_g_e31ad29e_62a8_401c_43ae_eb61300b4fc0_lines_type_rbl_0");
HtmlPage page2 = radioButton2.click();
HtmlSelect lineSelect = (HtmlSelect) page2.getElementById("ctl00_SPWebPartManager1_g_e31ad29e_62a8_401c_43ae_eb61300b4fc0_txt_dp_lines");
int size = lineSelect.getOptionSize();
System.out.println(size);
これはラジオボタン入力HTMLです:
<input id="ctl00_SPWebPartManager1_g_e31ad29e_62a8_401c_43ae_eb61300b4fc0_lines_type_rbl_0" type="radio" name="ctl00$SPWebPartManager1$g_e31ad29e_62a8_401c_43ae_eb61300b4fc0$lines_type_rbl" value="0" onclick="javascript:setTimeout('__doPostBack(\'ctl00$SPWebPartManager1$g_e31ad29e_62a8_401c_43ae_eb61300b4fc0$lines_type_rbl$0\',\'\')', 0)" />
<label for="ctl00_SPWebPartManager1_g_e31ad29e_62a8_401c_43ae_eb61300b4fc0_lines_type_rbl_0">Underground</label>
選択:
<select name="ctl00$SPWebPartManager1$g_e31ad29e_62a8_401c_43ae_eb61300b4fc0$txt_dp_lines" id="ctl00_SPWebPartManager1_g_e31ad29e_62a8_401c_43ae_eb61300b4fc0_txt_dp_lines" class="dplinee">
編集:わかりました。別のアプローチを試しました。JavaScriptエンジンの問題のように見えたので、自分でonclickアクションを実行してJavaScriptを無効にできると思いました。これは元のJavaScript関数です。
var theForm = document.forms['aspnetForm'];
function __doPostBack(eventTarget, eventArgument) {
if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
theForm.__EVENTTARGET.value = eventTarget;
theForm.__EVENTARGUMENT.value = eventArgument;
theForm.submit();
}
}
そして、これは私がしたことです:
HtmlForm aspnetForm = (HtmlForm) page.getElementById("aspnetForm");
HtmlHiddenInput eventTarget = (HtmlHiddenInput) page.getElementById("__EVENTTARGET");
HtmlHiddenInput eventArgument = (HtmlHiddenInput) page.getElementById("__EVENTARGUMENT");
eventTarget.setValueAttribute("ctl00$SPWebPartManager1$g_e31ad29e_62a8_401c_43ae_eb61300b4fc0$lines_type_rbl$0");
eventArgument.setValueAttribute("");
HtmlElement submitButton = (HtmlElement) page.createElement("button");
submitButton.setAttribute("type", "submit");
aspnetForm.appendChild(submitButton);
HtmlPage page2 = submitButton.click();
同じ古いSelectで同じページを取得し続けることを除いて、すべて良好です。これはかなり長くて退屈な質問だと思いますが、とにかく更新できると思いました。誰かが最終的にこれを試す忍耐力を持ってくれることを願っています(そして少なくとも私が明らかな間違いをしていないことを確認してください)。