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

14.経過情報照会ページ(各書類)を開く


ここでは上図に示した「経過情報表示」の「経過記録」のページにリンクされている各書類(明細書、拒絶理由通知書、手続き補正書、意見書など)を1つずつ開き、内容を読み込む方法について説明しようと思う。この処理は従来までの手法よりもやや複雑になるのだが、その理由として、まず、ここにどんな名称の書類がどの順で表示されているのかは、公報1つ1つ違うので、このページ内に多数存在しているAタグのうち、どれをクリックすればよいのか判断するのが難しいこと、さらには、同じ名称を有する複数の異なる書類(リンク)が存在している場合があること(上図のケースでは拒絶理由通知書、手続き補正書、意見書が3通ずつ存在している)などが挙げられる。

この「経過記録」のページに表示されている書類は、「審査記録」、「審判記録」、「PCT国際出願記録」の3つのブロックに分けて記載されている(審判記録とPCT国際出願記録のブロックは、該当する書類が存在する公報でのみ表示される)ので、それぞれのブロックごとに分割して処理する方法も考えられるが(拙作ツール「JPPD」ではそうしている)、ここでは全部まとめて処理する方法を紹介する。

このページの中には、クリックしたい⑩「特許願」などの書類名称へのリンク以外にも、ページ左上の「J-PlatPat」へのリンクや、「登録6621446」や「査定不服審判2019-013295」へのリンク、⑨「出願情報」ページへのリンクなどに加え、「拒絶理由条文コード」へのリンクなども含まれている。この中で、必要な書類へのリンクと不要なリンクを選定・判別する必要がある。

このページのソースを詳しく眺めてみると、⑩「特許願」などの書類へのリンクは <a class=”xx” で始まるAタグとなっているのに対し、「拒絶理由条文コード」へのリンクは <a style=”xx” で始まるAタグとなっている。その他の「J-PlatPat」へのリンクや、「登録6621446」などへのリンクは、<a class=”xx” で始まるAタグ、<a style=”xx” で始まるAタグ、さらには<span で始まるSPANタグが混在している状態のようである。これらのリンクの中から、クリックしたいリンクだけをどうやって選び出すのか、いくつかの方法が考えられるが、ここでは、そのうちの1つの方法を、以下に示す。

Dim flag As Integer
flag = 0

For Each objtag In objIE3.document.getElementsByTagName(“a”) Then
      If InStr(objtag.outerHTML, “<a class=”) > 0
            If InStr(objtag.text, “特許願”) > 0 Then
                  flag = 1
            ElseIf InStr(objtag.text, “TOP”) > 0 Then
                  flag = 0
            End If

            If flag =1 Then
                  objtag.Click

      ----------------------------
      新たに開いたウィンドウをオブジェクト変数(objIE4など)に取り込み
      ファイルに書き込むなり、変数に取り込むなりの処理を行い
      その後、開いたウィンドウを閉じる処理を行う
      ----------------------------

            End If
      End If
Next

上のコードを解説すると、「経過情報表示」ページの全てのAタグを順番に(左上から右下に)調べ、<a class= で始まるタグだけを選び出し、さらにそれが「特許願」以降で「TOP」より前のタグに限定して(flag = 1 のときだけ)、そのAタグをクリックしている。

多くの例を確認してみたところ、最初にクリックすべき書類名称は、ほとんどが「特許願」だが、稀に「出願審査請求書」となる場合(古い公報)や「国内書面」となる場合(PCT出願の場合)があるようなので、実用上は、これら3つのいずれかであれば flag = 1 とするのが良いだろう。一方、最後の書類名称は特定できないのだが、最後の書類の次のAタグは、たぶん必ずこのページの右下にある「↑」で、ソースコード上は「TOP」と表記されているAタグなので、このようなコードによって、必要な文書のリンクだけを次々とクリックできる(ようだ)。

なお、このようにして書類名称を次々とクリックして得られる書類は、たまたま同じ名称の場合があるので、例えばクリック回数 i をカウントし、書類名称の後に “_i” や “(i)” といった形で文書名にカウントを付加することで区別するような工夫をすればよいだろう。

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

12.「図面」を入手

ここまでで、目的の公報の文献表示画面から、書誌、要約、請求の範囲、詳細な説明を全て「開いた」状態にした後に、その内容をテキストファイルにダウンロードすることができたと思う。ここではさらに、図面もダウンロードしてみようと思う。

このためには、「請求の範囲」や「詳細な説明」を開くのと同様の処理で、「図面」の「開く +」をクリックしてやり、折り畳まれている図面セクションを開いた後に、objIE2.document.body.innerHTMLをファイルに書き込むなり、変数に取り込むなりの操作を行う。しかし、このままでは図を表示させることはできない。

この部分のソースコードを「要素の検査」にて見てみると、下に示すように、複数の図が、<img id=”〇〇” style=”△△” alt=”◇◇” src=”xx.jpg”> といった形式で記載されている。


このうちの src=”xx.jpg” の xxの部分が図面へのリンクを示すURLの一部となっており、xxの前に “https://www.j-platpat.inpit.go.jp/” を付け加えれば、この図が表示されるリンク先URLが得られるようである。そこで、図面のリンクURLが記載されている部分を書き換えてやればよいことになる。具体的には、このページのソースの中から”【図1】”以降の部分を取り出し、次に示すような処理を行うことで、その中の、src=”xx.jpg” の”xx”の部分を、”https://www.j-platpat.inpit.go.jp/xx.jpg” に文字列置換してやればよい。

Dim temp As String
Dim k As Integer

k = InStr(objIE2.document.body.innerHTML, “【図1】”)
temp = Mid(objIE2.document.body.innerHTML, k)

temp = Replace(temp, “src=” & Chr$(&H22) & “/gazette”, “src=” & Chr$(&H22) & “https://www.j-platpat.inpit.go.jp/gazette”)

13.「経過情報」を入手

ここからは、少しややこしい処理になるが、経過情報および審査記録などの各種書類の入手処理について示す。この処理は、いろいろな公報の経過情報ページを開き、そのソースを眺め、試行錯誤を繰り返しながら、どうにか思ったような結果が得られる処理手順を見つけたもので、あまりきれいな処理とは言えない。この処理を行うやり方は他にも色々とあるだろうと思うし、もっとずっとエレガントな処理方法があるのではないかと思うので、ここにあげたやり方を参考に、各自でより良い方法を考えて欲しい。

まずは、下図に示すように、「書誌」「要約」「請求の範囲」「詳細な説明」および「図面」を入手した「文献表示」ページにおいて、⑧で示した「経過情報」のボタンを探し、これをクリックすることで、「経過情報表示」ページを開く(このページは新たなウィンドウ(タブ)で開く)。この処理は、固定URLを表示させるために行った「URL」ボタンのクリック処理と同様である。


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

Set objtag = Nothing

上の操作によって表示される下図に示す「経過情報表示」ページは新たなウィンドウがタブで開き、「経過記録」のページが表示されているので、これをオブジェクト objIE3 に取り込んでやる。


Dim objIE3 As InternetExplorer
Dim shl As Object
Dim win As Object
Dim targetTitle As String

flag = 0
i = 1
targetTitle = “経過情報表示”

Do While flag = 0 And i < 300
      For Each win In shl.Windows
            DoEvents
            If win.Name = “Internet Explorer” Then
                  If InStr(win.document.title, targetTitle) > 0 Then
                        Set objIE3 = win
                        flag = 1
                        Exit For
                  End If
            End If
      Next
      Application.Wait [Now()] + 100 / 86400000
      i = i + 1
Loop

これにより「経過記録」のページが objIE3 に取り込まれたので、objIE3.document.body.innerHTML をファイルに書き込むなり、変数に取り込むなりすれば、その後、このページ内容に対してさらなる操作が可能となる。(実際には、次の処理を行う前に、ここでページの読み込みが完了したことを確認する処理が必要となるが、省略する。例えば「明細書」という文言が表示されるのを待つ等。)

次に、このページにて、「拒絶理由通知書」や「意見書」などの各書類の内容を取得しようとすると、ここまでとは少し異なる結構処理が必要となる。これについては、長くなりそうなので、新たな記事を立てて説明することにしたい。

一方で、このページには「経過記録」の他に、⑨で示すように「出願情報」、「登録情報」、「審判情報」および「分割出願情報」のページが開くリンクが表示されている。(経過記録と出願情報は全ての公報について表示されるが、その他のページは該当情報が存在している公報でのみ表示される。)ここでは、これらをクリックして「出願情報」や「登録情報」などのページを表示させる方法について示す。

例えば「出願情報」を開くには、「出願情報」というリンク⑨をクリックすればよいのだが、このページの関連部分のソースを見てみると、

<div class=”type_tab ng-star-inserted” _ngcontent-wdl-c420=””>
      <span _ngcontent-wdl-c420=””>出願情報</span>
</div>

となっており、このリンクは通常のAタグではなく、SPANタグとなっている。とはいえ、Aタグの処理の時と同様にSPANタグをクリックすることで、無事に所望のページが開くので、例えば「出願情報」をクリックする操作は、次のようになる。

For Each objtag In objIE3.document.getElementsByTagName(“span”)
      If InStr(objtag.outerHTML, “出願情報”) > 0 Then
            objtag.Click
            Exit For
      End If
Next

Set objtag = Nothing

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

この操作により表示される「出願情報」のページは、今まで「経過記録」が表示されていたページを書き換える形で開くので、オブジェクト objIE3 に取り込まれる。従って、特段の操作は必要なく、objIE3.document.body.innerHTMLを読み込むことで必要な情報が入手できる。

さらに、これと同様の処理によって、「登録情報」「審判情報」「分割出願情報」の各ページを開き、内容を読み込むことができる。(「出願情報」「登録情報」「審判情報」は、基本的に文字のみがhtmlのTable形式で表示されているページなので、単純にテキストとして処理できるが、「分割出願情報」は、各出願の間の関係が図示されており、そのまま内容をコピーして表示させると、公報番号などが黒塗りされたりしてうまく表示できないので、うまく表示させるためには工夫が必要なようだ。)

企業内技術士の勧め

このたび、このホームページを従来のサーバーから別のサーバーへと移管した。そのついでに、サイトをSSL対応に変更したので、URLが http://~ から https://~ に変更になった。

引越し作業の際に、以前書いて、そのまま公開し忘れていた原稿を発見。引越し作業がうまくできたのかのテストを兼ねて、この古い文章を公開することにした。考えてみると、「企業内技術士」という用語は決して一般的に広まっている用語ではないし、この文章も改めて読んでみると、独りよがりのところも感じられるが、誰かの役に立つこともあるかもしれない。なお、以下の文章は、2007年に書いたもので、その当時のまま(リンク切れのみ修正)掲載するので、現状とは必ずしも合わない部分があるが、ご容赦願いたい。

————————

私の場合、企業を退職→コンサルタント業を開始→技術士試験を受験→技術士資格取得→技術士事務所開設、という順番でここまで来たのだですが、これはどうやらかなり特異なケースのようです。通常コンサルタントとして独立する場合、企業を定年退職→技術士資格取得→技術士事務所開設→コンサルタント業を開始という順番か、技術士資格取得→企業内で通常の勤務→退職→技術士事務所開設→コンサルタント業開始、という順番が多いようです。

しかし、英語名称が Consulting Engineer から Professional Engineer に変更になったことからも明らかなように、決して技術士は独立コンサルタントのためだけの資格ではないし、実は資格保有者のうちで企業に勤務している割合は意外と多いようです。(社)日本技術士会の技術士制度についてによると、技術士全体の84%がコンサルタント会社を含む一般企業等に勤務しており、技術コンサルタントとして自営しているのはわずか7%に過ぎないようです。また、(社)日本技術士会の「事業概要」というパンフレットに掲載されているグラフによると、一般企業勤務の技術士とコンサルティング会社勤務の技術士の人数はほぼ同等数のようですから、一般企業勤務の技術士は全体の40%程度、2万人強と考えられます。

さて、企業内技術士にどんな役割が期待されているのかについては、技術士ビジョン21および、「技術士ビジョン21」職域別技術士の位置づけ 行動指針を見ていただくとして、ここでは、私自身が技術士資格を取得することで得られたものをベースに、現在企業内で技術者として働いている方々に対して、技術士資格取得の勧めをしてみたいと思います。

そもそも、建設部門などの一部(というか、これが技術士の大半を占めているのだが)を除くと、技術士資格は本業の仕事に直接影響するようなメリットはないのが実情です。私の場合には独立コンサルタントを仕事にしていますから、技術士資格自体に看板というか、一種のブランドとしての価値があると言えるわけです。しかし、もしも自分が今も会社員であったとしても、やっぱり技術士資格はチャレンジする価値のあるものだと思います。ここでは、会社員として働く個人にとっての技術士資格の価値を、資格そのものの価値、資格取得までのプロセスの価値、および資格取得後に得られる価値に分けて考えて見ます。

資格そのものが直接もたらす価値は、正直それほど大したものはないと思います。せいぜい、名刺などに「技術士」と記入することで、相手の見る目が多少変わってくるということがある程度でしょうか。技術士の知名度が低すぎて、その効果があまり得られないというのが実態でしょうが、初対面の際の話題作りの役ぐらいには立ちそうです。実は私自身、会社員時代には技術士の資格のことはあまり知りませんでしたし、後から振り返ってみると、以前お会いした人の中にも企業内技術士の方が何人かいらっしゃったのに、当時は全くそれに気付かずにお相手していたこともあるようです。

海外の場合には、日本の Professional Engineer という資格をどの程度認識してくれるか疑問ですが、日本版の PE だと説明すると、アメリカ人などは何となく納得してくれるようです。APEC Engineer 資格を取ると少しはましかも知れませんが、この資格もまた、まだまだアメリカなどでの知名度はかなり低いと思われます。それでも博士号を持っていない場合には、単なる “Mr.” ではなく、”PE” として対応してもらえる可能性があります。

私自身の体験からは、資格取得までのプロセスで得られるものがとても多かったと思っています。それは、技術士資格が他の技術系の資格と全く異なるものを要求する資格であることと関係していそうです。私の場合、会社員時代に会社のお金で、危険物取扱者、高圧ガス製造保安責任者、公害防止管理者、衛生管理者などの資格を取得させていただきました。いずれも(建前上は)業務遂行上に必要だ、という位置付けではあったのですが、かなり実務的であり、いずれにしても要求されるのは、科学的な知識や法律的な知識です。ここで必要な知識は、本来の仕事とは直接関係するものではなく、むしろ基礎知識や周辺知識になりますから、自分の知識の幅を広げるという点で意味があるのは確かですが、資格取得のプロセスも試験合格のための暗記が中心となってしまいます。

それに対して、技術士資格は、正に自分の本業である技術者としての知識や見識を問われるわけで、資格取得までに必要な勉強も、自分の今までの経験を振り返って整理したり、専門分野の知識を改めて振り返ったり、ということで自分の本業にそのまま役立つことばかりです。

技術士第一次試験では、専門科目以外に、科学一般の広く浅い知識を要求される基礎科目や、技術者倫理を問われる適性科目もありますが、これは企業内で何年も日々の仕事に没頭している技術者にとって、とても有意義な試験だと思います。基礎科目が要求する範囲やレベルは、いわば技術者にとって知っていて欲しい常識問題と言えるものの、毎日の仕事で直接必要となるわけではない知識です。でも、このような知識をバックグラウンドとして知っていることは、技術者としての幅と厚みを広げることになるし、きっと本業にも役立ってくれると思います。

また、適性科目で問われる技術者倫理は、これまた常識的な内容やレベルですけれど、企業内で仕事をしていると、なかなかゆっくりと立ち止まって考えることのなかった問題であると思います。最近は、企業倫理や研究者倫理が問題となることが多く、企業でもコンプライアンスや倫理の重要性が強調される機会も多くなっていると思います。しかし、適性科目で問われる技術者倫理は、あくまでも公共の利益を第一に考える倫理概念であり、必ずしも企業の論理や倫理と一致するとは限らないものです。試験では、あくまでも技術士試験が求める優等生的な回答をしなくてはなりませんが、企業の論理が全てではないということを考える機会として捉えることもできるわけで、いずれにしても適性試験はそれなりに意味のあるものだと思います。

2007/3/31

Excel VBAでSeleniumBasicを使用してChromeを操作し、J-PlatPatから公報をダウンロードする方法

ここまで、Excel VBAを使ってインターネットエクスプローラ(IE)を制御することで、J-PlatPatから特許公報テキストをダウンロードすることができるようになった。ところが、どうやらマイクロソフトは IE を見限ったようで、今後は徐々にサポート対象外となるような話が出ている。VBAでインターネットにアクセスし、ウェブページを操作したり、データをダウンロードしようとしたら、現時点ではIEを使うのが手っ取り早い方法ということになるが、今後はそれがどうなるのか、今の時点では特にアナウンスはされていないようだ。

また、IE だと、Espacenet にアクセスしても一部の公報で表示がうまく行われないという現象も見られるようなので、何とかしたいと考えていたところでもあり、この際、IE以外のブラウザを操作して、インターネットからデータをダウンロードする方法として、SeleniumBasic を使用した Google Chrome の操作にチャレンジしてみた。

ここでは、IEを操作するマクロと比較しやすいように、ここまで説明してきた J-PlatPat からテキスト公報をダウンロードする操作と全く同じ動作をするマクロを、SeleniumBasic を使用して行うことにした。IEを操作するマクロの詳細については、「Excel VBAを使用してJ-PlatPatから公報テキストをダウンロードする方法」の(1)(2)(3)(4)(5)を参照いただきたい。

1.準備

Excel VBAでSeleniumBasicを使用してGoogle Chromeを操作するためには、SeleniumBasicのインストール、Chromeドライバーのインストール、Excel VBAへの参照設定といった事前作業が必要となる。これらの作業については、いくつかのサイトで丁寧に説明がなされているので、これらを参照願いたい(例えば、以下のサイト)。

 ・VBAのスクレイピングを簡単楽にしてくれるSelenium
 ・非エンジニアにこそ伝えたいSeleniumBasic
 ・Seleniumを使ってVBAからchromeブラウザ操作(VBA編)

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

最初に、Chromeを立ち上げ、J-PlatPatのトップページを開く。既にChromeが立ち上がっている場合には、それとは別の新たなウィンドウで立ち上がる。なお、SeleniumBasicが立ち上げた新たなChromeのウィンドウの左上には「Chromeは 自動テスト ソフトウェアによって制御されています。」という表示が出る。

Dim Driver As New Selenium.WebDriver
Dim url As String

url = “https://www.j-platpat.inpit.go.jp/”

Driver.Start “chrome”
Driver.Get url

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

所定のURLのサイトを開くところまでは特に問題はない。SeleniumBasicの場合、ブラウザがビジーの間は処理が戻ってこないようなので、IE制御の場合にはお約束のように多用した objIE.readystate と objIE.Busy をチェックする Do While ループは必要ない。それでも、表示が完了したかどうかのチェックは必要なので、ここではHTML中に”>検索<“が含まれていることが確認できるまで待機している。なお、IE制御のときの objIE.document.body.innerHTML に該当するのが、SeleniumBasic では Driver.PageSource である。

3.公報番号を入力し、検索ボタンをクリックし、検索結果一覧の表示完了を確認する

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

Driver.FindElementById(“s01_srchCondtn_txtSimpleSearch”).Clear
Driver.FindElementById(“s01_srchCondtn_txtSimpleSearch”).SendKeys patnum
Driver.FindElementByName(“s01_srchBtn_btnSearch”).Click

i = 1
Do While InStr(Driver.PageSource, “特願”) = 0 And i < 300
      DoEvents
      i = i + 1
      Application.Wait [Now()] + 100 / 86400000
Loop

前半部分では、テキストボックス”s01_srchCondtn_txtSimpleSearch”に公報番号を入力し、検索ボタン”s01_srchBtn_btnSearch”をクリックしている。IE制御の際には、何やらややこしい操作が必要だったのだが、SeleniumBasicでは教科書通りに SendKeys でテキストを送信し、ボタンをクリックすることで問題なく検索される。ただし、テキストボックス内に既にテキストが入っている場合には、それに追加されてしまうので、事前にクリアしてからテキストを送信するようにしている。

後半部分では、検索結果一覧表が表示されたことを確認するため、”特願”という語句が検出されるか、または繰り返し回数が300回となるまで、ループさせている。

4.検索結果一覧にて公報のリンクをクリックし、文献表示画面を取り込む

Dim wEle As WebElement
Dim flag As Integer

flag = 0
i = 1
Do While flag = 0 AND i < 300
      For Each wEle In Driver.FindElementsByTag(“a”)
            If InStr(wEle.Text, patnum) > 0 Then
                  wEle.Click
                  flag = 1
                  Exit For
            End If
      Next
      Application.Wait [Now()] + 100 / 86400000
      i = i + 1
Loop

Set wEle = Nothing

ここでは、Driverの中に含まれるすべてのAタグの中から、所望の公報番号をテキストとして持っているAタグを見つけ、これをクリックする。この部分では使っている関数名が微妙に異なっているが、IE制御のときとほとんど変わりがない。クリック操作により、特許・実用新案文献表示画面が別ウィンドウで表示される。

このままでは、オブジェクト変数Driverには、まだ最初のウィンドウが入ったままであり、新たに開いたウィンドウの操作ができないので、切り換える。IE操作の際には、ここで立ち上がっている全てのウィンドウの中から所望のウィンドウを探し出し、そのウィンドウをオブジェクト変数に取り込む必要があったが、SeleniumBasicでは、次の1行で済む。

Driver.SwitchToNextWindow

これで新たに開いたウィンドウが、変数Driver に取り込まれるのだが、この後このウィンドウを閉じて、元のウィンドウを操作したりする際に、今どのウィンドウを操作しているのかわかりにくいので、次のように明示的にウィンドウを取り込む方法の方が良いかもしれない。

Dim targetTitle As String

targetTitle = “特許・実用新案文献表示|J-PlatPat [JPP]”
Driver.SwitchToWindowByTitle (targetTitle)

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

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

For Each wEle In Driver.FindElementsByTag(“a”)
      If InStr(wEle.Text, “要約”) > 0 And InStr(wEle.Text, “開く”) > 0 Then
            wEle.Click
            i = 1
            Do While InStr(wEle.Text, “開く”) > 0 And i < 300
                  DoEvents
                  Application.Wait [Now()] + 100 / 86400000
                  i = i + 1
            Loop
            Exit For
      End If
Next

Set wEle = Nothing

最初に、文献表示画面にて、”図面” という語句が表示されたのが確認されるまで、待機し、その後、折り畳まれていた 「要約」 のリンクをクリックして内容を表示させている。要約の内容が表示されると、「要約」のリンクの右側の「開く +」が「閉じる -」に変わるので、「開く」が消えたことが確認されるまで待機している。

2021/02/03 ここの部分、J-PlatPat側の仕様変更に伴い、修正。
 文献表示画面にて、最初から「要約」が開いた状態で表示されるように変更になったので、「要約」のリンクを見つけ、その横に「開く +」の表示がある場合には「要約」のリンクをクリックするが、「開く +」の表示がない(既に開いている)場合には、その操作をスキップするように変更した。

その後、「請求の範囲」と「詳細な説明」に対しても、「要約」に対して行ったのと同様の処理を行う。これによって、必要な情報が全て表示された状態となっているはずである。

6.固定URLを表示させ、表示内容をダウンロード

For Each wEle In Driver.FindElementsByTag(“a”)
      If InStr(wEle.Text, “URL”) > 0 Then
            wEle.Click
            Exit For
      End If
Next

Set wEle = Nothing

Dim Fname As String
Fname = “D:\” & patnum & “.txt”

Open Fname For Output As #1
      Print #1, Driver.PageSource
Close #1

targetTitle = “簡易検索|J-PlatPat [JPP]”
Driver.Close
Driver.SwitchToWindowByTitle (targetTitle)

前半では、全てのAタグの中から、URLボタンを探し、これをクリックして固定URLを表示させている。ここまでの操作により、オブジェクト変数 Driver に必要な情報がすべて取り込まれたので、Driver.PageSource をテキストファイルに書き込んでいる。さらにこのウィンドウをクローズしたのち、SwitchToWindowByTitleで、検索結果一覧表が表示されている最初のウィンドウに操作を移す。これで、上の「4.」に戻って、次の公報のリンクをクリックして詳細画面を開くといった一連の操作を継続することが可能となる。

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 And InStr(objtag.Text, “開く”) > 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秒間待機する、という処理にしている。

2021/02/03 ここの部分、J-PlatPat側の仕様変更に伴い、修正。
 文献表示画面にて、最初から「要約」が開いた状態で表示されるように変更になったので、「要約」のリンクを見つけ、その横に「開く +」の表示がある場合には「要約」のリンクをクリックするが、「開く +」の表示がない(既に開いている)場合には、その操作をスキップするように変更した。

実際には、この場面には例外がいくつかある。特許公報や公告公報の場合には、そもそも要約が含まれていないので、”要約”リンクが表示されない。また昭和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を操作する場合には、この方法は非常に有効であると言えそうだ。

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