「すべて表示」リンクは、Web ページ上の Javascript 関数への呼び出しであり、次のように呼び出されます。
__doPostBack('ctl00$ContentPlaceHolder1$PGN01','')
私の主なブラウザーは Firefox で、使用できる優れたアドオンがあります。「Web Developer」アドオンを使用しました。
ページのあるタブで、次の操作を行います。マウス カーソルを [すべて表示] リンクの上に置きます。次に、右クリックして [Web 開発者] > [情報] > [Javascript を表示] Alt+Shift+J を選択すると、Firefox は、そのページが使用しているすべての Javascript を含む新しいタブを開きます。
タブで - クイック検索により、次のようにコード化された __doPostBack 関数が見つかります。
function __doPostBack(eventTarget, eventArgument) {
if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
theForm.__EVENTTARGET.value = eventTarget;
theForm.__EVENTARGUMENT.value = eventArgument;
theForm.submit();
}
}
その JavaScipt 関数は、if ステートメントのテストが true と評価され、関数への呼び出しからの引数を使用する場合、以下の JavaScript コードに縮小できます。
theForm.__EVENTTARGET.value = 'ctl00$ContentPlaceHolder1$PGN01';
theForm.__EVENTARGUMENT.value = '';
theForm.submit();
ここで、「theForm」が何であるかを知る必要があります。
以下のコードは、__doPostBack 関数のすぐ上で見つかりました。
var theForm = document.forms['aspnetForm'];
if (!theForm) {
theForm = document.aspnetForm;
}
このことから、「theForm」は id 属性「aspnetForm」(id=「aspnetForm」) を持つ「form」HTML タグへの参照であることがわかります。これは、HTML ドキュメントで探す必要があることを意味します。次のように始まる何か:
<form id="aspnetForm"
タグがどのように記述されているかを正確に知るために、Firefox ブラウザーを使用して、関心のあるページの変更された HTML を確認します。
ここでは、FireBug アドオンを使用しています。
HTML フォームの開始タグは次のようになります。
<form id="aspnetForm" onsubmit="javascript:return WebForm_OnSubmit();"
action="/Shoes-All.aspx" method="post" name="aspnetForm">
つまり、アクションは同じ HTML ドキュメントを使用しています。
WebForm_OnSubmit() 関数が何をしているか見てみましょう:
function WebForm_OnSubmit() {
if (typeof(ValidatorOnSubmit) == "function" && ValidatorOnSubmit() == false)
return false;
return true;
}
ValidatorOnSubmit() 関数と、それが使用している興味深い変数を見てみましょう。
var Page_ValidationActive = false;
// ...
function ValidatorOnSubmit() {
if (Page_ValidationActive) {
return ValidatorCommonOnSubmit();
}
else {
return true;
}
}
これは、関数が常に「true」を返すことを意味するため、フォームの開始タグを次のように書き換えることができます。
<form id="aspnetForm" onsubmit="javascript:return true;"
action="/Shoes-All.aspx" method="post" name="aspnetForm">
このことから、Web ページを Web サーバーからリロードする必要があると結論付けることができます。
ここで、HTTP POST 要求で使用される変数と値を知る必要があります。
そのために、JavaScript をオンにして Firefox を再び使用しました。また、素晴らしい Firebug Add-On を使用しています。
最初の div タグのフォーム要素には、次のようなものがあります。
<div>
<input id="__EVENTTARGET" type="hidden"
value="" name="__EVENTTARGET">
<input id="__EVENTARGUMENT" type="hidden" value="" name="__EVENTARGUMENT">
<input id="__LASTFOCUS" type="hidden" value="" name="__LASTFOCUS">
<input id="__VIEWSTATE" type="hidden"
value="(lots of data here)" name="__VIEWSTATE">
</div>
以前の縮小された JavaScript コードを覚えている場合は、フォーム内の 2 つの入力タグの値属性が変更されたため、HTML がその関数によって変更されたので、実際には次のようになります。
<div>
<input id="__EVENTTARGET" type="hidden"
value="ctl00$ContentPlaceHolder1$PGN01" name="__EVENTTARGET">
<input id="__EVENTARGUMENT" type="hidden" value="" name="__EVENTARGUMENT">
<input id="__LASTFOCUS" type="hidden" value="" name="__LASTFOCUS">
<input id="__VIEWSTATE" type="hidden"
value="(lots of binary data here)" name="__VIEWSTATE">
</div>
もちろん、ID「_VIEWSTATE」の入力タグの値属性の内容をそのままコピーする必要があります。
参考までに、Firefox によると、_VIEWSTATE 入力タグ XPath は次のようになります。
//*[@id="__VIEWSTATE"]
...そして、そのCSSセレクターは次のとおりです。
form#aspnetForm div input#__VIEWSTATE
Web サーバーからすべてのアイテムをダウンロードしたら、次に nedd を使用して HTML ページを解析します。
興味深いコンテンツがフォームの奥深くに埋め込まれています。HTML表です。
テーブルに関連する XPath は次のとおりです。
//*[@id="ctl00_ContentPlaceHolder1_dlList"]
...そしてCSSセレクターは
table#ctl00_ContentPlaceHolder1_dlList
これには、tbody、tr、td、div、および別のテーブルが含まれています (=もっと悪い設計 - 誰かがテーブルのない設計について学ぶ必要があります。HTML テーブルは、スマートフォンやタブレットでは見栄えが悪くなります。)
この時点で、Beautiful Soup 4 パーサーを稼働させる必要があると思います。