HTMLテーブルをスクレイプしてCSVに出力する汎用rubyスクリプト

  • 入力HTMLファイル
$ cat table.html 
<table>
    <tr>
      <th>都道府県</th>
      <th>テレビ局のYouTube公式チャンネル</th>
    </tr>
    <tr>
      <td>北海道</td>
      <td>HTB北海道テレビ</td>
    </tr>
    <tr>
      <td>愛知県</td>
      <td>メ~テレチャンネル</td>
    </tr>
</table>
  • ruby スクリプト
$ cat scrapeHTMLTable.rb
require 'nokogiri'
require 'csv'

file = File.open('table.html', 'r').read
html = Nokogiri::HTML(file)

# テーブルヘッダーの取得
headers = []
#html.xpath('//*/table/thead/tr/th').each do |th|
html.xpath('//*/table/tr/th').each do |th|
  headers << th.text
end
#p headers

# テーブル各行の取得
rows = []
#html.xpath('//*/table/tbody/tr').each_with_index do |row, i|
html.xpath('//*/table/tr').each_with_index do |row, i|
  rows[i] = {}
  row.xpath('td').each_with_index do |td, j|
    rows[i][headers[j]] = td.text.strip
  end
end
#p rows

# CSV生成
csv_string = CSV.generate do |csv|
  
  # CSVヘッダー
  csv << headers
  
  rows.each do |hash|
    csv << hash.values
  end
end

# CSV出力
puts csv_string
  • 実行結果
$ ruby scrapeHTMLTable.rb
都道府県,テレビ局のYouTube公式チャンネル

北海道,HTB北海道テレビ
愛知県,メ~テレチャンネル