Excel VBAを使用してJ-PlatPatから公報テキストをダウンロードする方法(3)

4.J-PlatPatのトップページを開く

最初に、IEを立ち上げ、J-PlatPatのトップページを開く。この操作は、以下のように参考サイトの実例をそのまま真似て、URLだけを”https://www.j-platpat.inpit.go.jp”とすれば、特に問題ない。

Dim objIE As InternetExplorer
Dim url As String

Set objIE = CreateObject(“InternetExplorer.Application”)
objIE.Visible = True
url = “https://www.j-platpat.inpit.go.jp/”

objIE.Navigate2 url

Do While objIE.readyState <> 4 Or objIE.Busy
      DoEvents
Loop

これで、下図のように IE が起動し、J-PlatPatのトップページが開く。このとき、変数 objIE にこのページの情報がオブジェクトとして取り込まれる。最後の3行は、ページ内容の読み込みが完了するのを待つための、お約束みたいなもの。

ここで、読み込みが完了していないまま、次の操作(公報番号の入力や、検索ボタンのクリック)を行うと、エラーが出たり、操作を正しく受け付けてくれない。実際に動かしてみると、問題なく次の操作(公報番号の入力、検索ボタンのクリック)まで進むこともあるのだが、結構な確率で、次のようなエラーメッセージが出たり、

はたまた、(テキストボックスに公報番号を入力してからクリックしたはずなのに)下図のように「検索キーワードを入力してください。」といったメッセージが出てしまうことがある。

試しに、手動でステップ実行してみると、特にエラーが出たりすることはないので、どうやら連続実行すると、まだ完全に準備が整わないうちに次の操作が行われるために発生するエラーのようだ。ならば、次の操作に入る前に適当な待ち時間を入れてもいいのだが、サイトの状況やPCの状況によっても必要な待ち時間は変わるだろうし、不必要に長い待ち時間を入れるのも面白くない。

そこで、「次の操作の受付準備完了」≒「前の操作(表示)が完全に終了」と考え、次のように、「検索」ボタンが表示されていることを確認し、表示されていないときは表示されるのを待つ、という意図のコードを書いてみた。(このページ内に”検索”という語句は何度も出てきているが、document.body.innerHTMLを調べてみると、”>”と”<“で挟まれた”検索”は、検索ボタン②のところだけにしか存在していないようだ。)

Do While InStr(objIE.document.body.innerHTML, “>検索<“) = 0
      DoEvents
      Application.Wait [Now()] + 100 / 86400000
Loop

(※ 3行目は、100ミリ秒の時間待ち操作である)

その結果、テストした範囲では、先に出たようなエラーは全く出なくなった。実際に、Do While ~ Loopを何度回っているかを調べてみると、毎回異なるが0~5回程度となったので、このコードは有効に機能しているようだ。

このように、JavaScriptで書かれたページの読み込み完了を待つためには、お約束の objIE.readyStateやobjIE.Busyをチェックするだけではなく、確かにそのページの表示が完了したであろうことを確認してから次の操作に進む方法が有効となるようだ。

5.公報番号をテキストボックスに入力し、検索ボタンをクリック

次に、公報番号をテキストボックス(検索窓)に入力し、検索ボタンをクリックする。公報番号は、”特開2019-123456″、”特開平01-123456″、”特許6543210″などの形式で入力する。ここには、複数の公報番号の入力が可能で、10個以上の入力も可能なようだが、念のため最大10個ぐらいにしておくのが無難だと思われる。複数の公報番号を入力する場合、公報と公報の間はスペース区切りとする。なお、公報番号の入力形式が多少異なっていても、J-PlatPat側で正しく理解してくれる場合もあるが、ハイフンの後は6桁、特許番号は7桁等、J-PlatPatでの正式な形式にそろえておく方が、あとのVBAのコーディングが楽になる。

まず、ブラウザ等の機能を使用して、このページの要素を調査し、テキストボックス①と検索ボタン②の要素名(NameまたはID)を調べる。すると、テキストボックス①は、IDが”s01_srchCondtn_txtSimpleSearch”であり、検索ボタン②は、Nameが”s01_srchBtn_btnSearch”であることがわかった。

そこで、テキストボックス”s01_srchCondtn_txtSimpleSearch”に公報番号を入力し、検索ボタン”s01_srchBtn_btnSearch”をクリックすればよいはずだが、これがなかなかうまくいかない。実際に、下のようなコードを書いて実行してみると、テキストボックス①内には確かに入力した公報番号が表示され、一見うまくいったように見えているのだが、クリック後に「検索キーワードを入力してください。」というメッセージが出てしまう。

Dim patnum As String
patnum = “特開2018-010101”

objIE.document.getElementById(“s01_srchCondtn_txtSimpleSearch”).Value = patnum
objIE.document.getElementsByName(“s01_srchBtn_btnSearch”)(0).Click

ここで3行目を”○○.Value = patnum”の代わりに、”○○.innerText = patnum”に代えてみると、patnumはテキストボックス①内に、灰色で表示され、クリック後には先ほどと同じ「検索キーワードを入力してください。」というメッセージが出てしまう。

この問題を解決すべく、色々と調べたり、試したりしてみたのだが、どうしてもテキストボックスへの入力がうまくいかない。半ばあきらめかけていたのだが、たまたま、”○○.Value = patnum”の行と”○○.innerText = patnum”の行の両方を実行した後に検索ボタンのクリック操作をしてみたところ、何とこれがうまく動き、検索が実行されたのである!!(これは一体どういう理屈なのか、まったく理由は不明) その後、さらに色々とテストしてみた結果、テキストボックス①にフォーカスを当てた後に、innerTextで公報番号を入力する方法でもうまくいくことがわかった。ということで、最終的に、次のようなコードで、無事にテキストボックス①に公報番号を入力した後に、検索ボタン②をクリックして、検索を実行させることができるようになった。

objIE.document.getElementById(“s01_srchCondtn_txtSimpleSearch”).Focus
objIE.document.getElementById(“s01_srchCondtn_txtSimpleSearch”).innerText = patnum
objIE.document.getElementsByName(“s01_srchBtn_btnSearch”)(0).Click

Do While objIE.readyState <> 4 Or objIE.Busy
      DoEvents
Loop

実際のプログラムでは、動作をより確実に行うため、テキストボックスへのinnterTextの入力と検索ボタンのClickの実行との間に、100ミリ秒程度の待ち時間を入れているが、通常、この待ち時間はなくても問題なさそうである。

次回は、検索結果一覧表の目的の公報のリンクをクリックして、文献表示画面を表示し、書誌事項、要約、請求の範囲、詳細な説明などをダウンロードする操作について説明する。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です