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

9.「要約」、「請求の範囲」、「詳細な説明」を開く

ここまでの操作で、目的の公報の文献表示画面が開き、このウインドウを変数 objIE2に取り込むことができた。ここでも、次の操作に入る前に表示の完了を確認することが重要である。既にオブジェクトの読み込みまで完了しているのだから、問題なさそうなものだが、実際にここで表示完了の確認をせずに、次の操作として、「要約」のリンクを探してクリックしようとすると、「要約」のリンクが見つからないという事態が頻繁に発生する。そこで、この画面の表示が完了したことを、ここでは”図面”という語句の表示によって確認する(”図面”ではなくて、”詳細な説明”でも良いはず)。

i = 1
Do While InStr(objIE2.document.body.innerHTML, “図面”) = 0 And i < 300
      DoEvents
      i = i + 1
      Application.Wait [Now()] + 100 / 86400000
Loop

さて、この状態では、書誌だけが内容表示されており、要約、請求の範囲、詳細な説明は、閉じた状態となっていて内容は表示されていない。そのため、これらを全て開いた状態にして、内容を表示させる必要がある。(例外があって、サイズが非常に大きい公報は、書誌、要約、請求の範囲、詳細な説明が、それぞれのブロックに分割されず、1つにまとまった状態になった上で、複数のページに分割されて表示される。例えば、特開2019-010101)

そこで、下図の④、⑤および⑥のリンクをクリックすることで、それぞれ「要約」、「請求の範囲」および「詳細な説明」の内容を表示させてやる。

ここでは「要約」をクリックし、内容を表示させる処理についてコードを下に示す。

For Each objtag In objIE2.document.getElementsByTagName(“a”)
      If InStr(objtag.outerHTML, “要約”) > 0 Then
            objtag.Click
            Do While objIE2.readyState <> 4 Or objIE2.Busy
                  DoEvents
            Loop

            i = 1
            Do While InStr(objtag.Text, “開く”) > 0 And i < 300
                  DoEvents
                  Application.Wait [Now()] + 100 / 86400000
                  i = i + 1
            Loop
            Exit For
      End If
Next

Set objtag = Nothing

最初に、このページ(objIE2)の全てのAタグの中から、outerHTMLに”要約”を含むタグを探し、これをクリックする。クリックした後、objIE2.readyState と objIE2.Busy を Do While~Loop でチェックする準備完了待ち処理を行う。内容が表示されると、「要約」のリンクの右側の表示が「開く +」から「閉じる -」に変わるので、その確認を行う。この確認を行わずに、次の処理に進むと、準備ができていないうちに次の命令が来てしまうため、その処理を実行できないことがあるようだ。ここでは、「開く」が表示されたままであれば、「開く」が表示されなくなるまで、最大30秒間待機する、という処理にしている。

実際には、この場面には例外がいくつかある。特許公報や公告公報の場合には、そもそも要約が含まれていないので、”要約”リンクが表示されない。また昭和57年以前の公開公報などの古いものは、このページが開いたときに、要約、請求の範囲、詳細な説明が閉じた状態となっている点は同じなのだが、”要約”と”請求の範囲”のリンクをクリックしても、その内容が表示されることはなく、今まであったリンクそのものがそれぞれ消えてなくなってしまう一方で、”詳細な説明”をクリックすると、特許請求の範囲と詳細な説明が1つのブロックとしてまとめて表示される。(画面からは”要約”の文字やリンクが消え、objIE2.document.body.innerHTMLからも”要約”は消えてしまうが、objtag.Textの中には、”開く”がそのまま残っているので、それらを考慮して処理する必要がある)そんなわけで、ここの処理は、これら様々な例外にも対応した複雑なものにする必要があるが、ここでは省略する。

続いて、「要約」に対して行ったのと同様の処理を、「請求の範囲」と「詳細な説明」に対しても行う。これは、”要約”の部分を、それぞれ”請求の範囲”と”詳細な説明”に置き換えるだけでよい。これによって、このページには、書誌、要約、請求の範囲、詳細な説明が、それぞれ開いた状態で表示されているはずである。(公報によっては、例外もあるが。(特許公報、公告公報、古い公報など))

10.固定URLを表示

書誌、要約、請求の範囲、および詳細な説明の全てがそれぞれ開いた状態になったので、最後に、この公報の固定URLを取得する。これには、このページの右上に並んでいるいくつかのボタンのうち、「URL」ボタン(下図の⑦)をクリックする。

すると、次のように、URLが表示されたメッセージがポップアップする。 (このとき、2.事前設定、(2) IEの設定、②のスクリプトによる貼り付け処理の設定を正しく行っていないと、ここの処理がうまく動かないので、必ず事前設定を行っておくことが重要である)。

URLボタンをクリックする処理は、次の通り。

For Each objtag In objIE2.document.getElementsByTagName(“a”)
      If InStr(objtag.outerHTML, “URL”) > 0 Then
            objtag.Click
            Exit For
      End If
Next

Set objtag = Nothing

11.表示内容をダウンロード

URLはクリップボードにコピーされているはずだが、ここではわざわざクリップボードの中身を見に行ったりせず、また、この「URLコピー」というメッセージを消すこともなく、ここで表示されているウインドウ(objIE2)の中身を全部まとめてダウンロードする。

Dim Fname As String

Fname = “D:\” & patnum & “.txt”

Open Fname For Output As #1
      Print #1, objIE2.document.body.innerHTML
Close #1

objIE2.Quit
Set ObjIE2 = nothing

ここで、objIE2.document.body.innerHTML には、この公報の、書誌、要約、請求の範囲、詳細な説明、およびURLが全て含まれているので、innerHTMLをそのまま全部ファイルに書き込んでみた。後で、このファイルを読み込んで、必要な情報をそこから取り出したり、加工したりすればよい(もちろん、ファイルに書き込まず、変数に取り込んで、引き続き様々な処理を行っても良い)。

最初に検索窓に入力した複数の公報のうち、次の公報をダウンロードするためには、「7.検索結果一覧にて公報のリンクをクリック」に戻って、objIE の中から次の公報のAタグを探してクリックする操作以降を順次繰り返せばよい。

J-PlatPat側の応答速度、ネットの速度、こちらのPCの速度など、様々な要因によって、全体の処理速度は大きく影響を受けるため、早いときには1件5秒以内に操作を終えることができる一方、遅いときには1件に30秒以上かかるときもあるのだが、与えられた状況の下で、ほぼ最短時間で処理できるようになったのではないかと思われる。最初は、1つ1つの処理の前に、数秒間ずつのwaitを入れていたが、それでも応答の遅いときにはエラーが出たり、取りこぼしが出たりしていたのがウソのように、ほぼ問題なくサクサクと処理を終えることができるようになったようだ。そのポイントとなったのは、それぞれの処理の前に、都度、その準備が完了していることを何らかの方法で確認するルーチン(次の段階の表示が行われたことを確認するループや、前の段階の表示が消えたことを確認するループなど)を入れることであった。少なくともJ-PlatPatを操作する場合には、この方法は非常に有効であると言えそうだ。

一応、これで目的の処理を終えることができたようなので、今回の連載はこれで終わりにしたい。質問やコメントがあれば、遠慮なく書き込んでください。

コメントを残す

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