このエントリーをはてなブックマークに追加


PowerShellでHTMLのtableタグをスクレイピング・解析する・XmlDocument

tableタグで作成された表を解析しcsvなどにしたい場合はありませんか?
本資料では、単純なHTMLを用意しHTMLファイルのスクレイピングをしてみます。


使用したWindowsとPowerShell

  • Windows
    ver.png
     
  • PowerShell
    PS C:\> $PSVersionTable.PSVersion
    
    Major  Minor  Build  Revision
    -----  -----  -----  --------
    5      1      18362  145

関連記事

curlやwgetのようにURLを指定して情報を取得する場合は、以下の記事を参考にしてください。

[xml]を使用してtableタグ内の情報をスクレイピングする

以下のHTMLファイルを用意しました。

10.png

sample.html filesample.zip

<html>
    <head>
        <title>sample</title>
    </head>
    <body>
        sample table
        <table>
            <tr>
                <th>No</th><th>value1</th><th>value2</th>
            </tr>
            <tr>
                <td>1</td><td>11</td><td>12</td>
            </tr>
            <tr>
                <td>2</td><td>21</td><td>22</td>
            </tr>
            <tr>
                <td>3</td><td>31</td><td>32</td>
            </tr>
        </table>
    </body>
</html>

htmlファイルをSystem.Xml.XmlDocumentオブジェクトとして読み込むためには、以下の構文になります。

$obj = [xml](Get-Content ファイル名)

上記の通り、htmlファイルをXmlDocumentオブジェクトに読み込み操作することになります。

HTMLファイルをXmlDocumentオブジェクトに読み込み操作する

以下は、用意したsample.htmlをDドライブ直下に置いてPowerShellにて操作した実行例となります。

  1. htmlファイルを読み込みます。
    PS D:\> $obj = [xml](Get-Content D:\sample.html)
    #br
  2. 読み込んだ情報($objに格納)を表示するとhtmlタグがあることが確認できます。
    PS D:\> $obj                                                                                                            
    html
    ----
    html
    #br
  3. htmlタグを指定し表示しています。headとbodyがあることが確認できます。
    PS D:\> $obj.html                                                                                                       
    head body
    ---- ----
    head body
    #br
  4. bodyタグを指定すると、テキストとtableタグがあることが確認できます。
    PS D:\> $obj.html.body                                                                                                  
    #text                          table
    -----                          -----
    ...                            table
     
  5. textの内容を取ってみます。
    HTML内のテキストを取得することができました。
    PS D:\> $obj.html.body.'#text'                                                                                          
            sample table
     
  6. tableタグを指定すると、trが4つ存在しているのが確認できます。
    PS D:\> $obj.html.body.table                                                                                            
    tr
    --
    {tr, tr, tr, tr}
    
    PS D:\> $obj.html.body.table.tr.count
    4
     
  7. 実際にtr分ループしtr内の要素を表示してみます。
    以下のスクリプトをコピー&ペーストしEnterキーを押して実行してみてください。
    $table = $obj.html.body.table
    $tr_count = $table.tr.Count
    for ($i=0; $i -lt $tr_count; $i++) {
      if ($i -eq 0) { $table.tr[$i].th } else { $table.tr[$i].td }
    }
    11.png
     
  8. csv文字列としてとして出力してみます。
    $table = $obj.html.body.table
    $tr_count = $table.tr.Count
    for ($i=0; $i -lt $tr_count; $i++) {
      if ($i -eq 0) { $t = $table.tr[$i].th } else { $t = $table.tr[$i].td }
      $t[0] + "," + $t[1] + "," + $t[2]
    }
    12.png

以上、XmlDocumentオブジェクトを使って、HTMLをスクレイピングするサンプルでした。



添付ファイル: filesample.zip 500件 [詳細] filever.png 634件 [詳細] file12.png 643件 [詳細] file11.png 667件 [詳細] file10.png 669件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019-09-16 (月) 10:37:53