裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

HTMLをスクレイプしてCSVに変換

2017年03月15日 | ブログラミング

HTMLをスクレイプしてCSVに変換

締め切りが 2017/03/15 10:00 AM なので,その 1 分後に投稿されるように予約

設問

Webページに含まれるテーブルの中身をスクレイプして、Excelなどで集計がしやすいようCSVファイルに変換する。
定期的に行う必要があるため、手作業で行うのではなく自動化したい。

求められるプログラムの仕様は、以下の通り。


    標準入力から、HTML準拠(Wikipedia参照)のテキストデータが送られる
    入力されるHTMLはフォーマットが正しい、具体的にはW3Cの構文検証サイトでエラーがないことを前提とする
    また、HTMLはUTF-8でエンコーディングされ、多バイト文字は含まれないものとする
    HTMLには、tableタグが1つだけ含まれる(テーブルは単体である)
    テーブル内のセルはtr, th, tdタグで構成され、セルが連結されることはない
    HTML内のテーブルを表形式として抽出し、CSVフォーマット(Wikipedia参照)で標準出力に返すこと
    出力するCSVはコンマ「,」(U+002C) 区切りで、すべてのフィールドをダブルクォート「"」(U+0022)で囲むこと
    CSVのフィールドとして出力される文字列は、thまたはtdタグ内のテキストに限定すること
    thおよびtdタグの扱いは、CSV出力時において変える必要はない
    thおよびtdタグ内に、さらにタグが含まれる場合、タグ自体は除去し配下のテキストだけを抽出すること
    文字列フィールドは文字実体参照(Wikipedia参照)を用いてアンエスケープ処理をすること
    ただし、(大なり記号)、&(アンパサンド)のみの対応でよいものとする

【問題】
標準入力から、HTMLフォーマットのテキストが送られます。
このHTMLからtableタグで囲まれた領域をスクレイプし、CSVに変換した上で、その結果を標準出力に返してください。
なお、アンエスケープ処理も忘れずに。

=================================================

f = function(s) {
    ncol = sum(grepl("", s))
    s = gsub("", "", s)
    s = gsub("title", "", s)
    s = gsub("&", "&", s)
    s = gsub("<", "    s = gsub(">", ">", s)
    s = (s[s != ""])[-1] # テストシステムでは先頭に 1 個の NULL が付いてしまっている
    apply(matrix(s, byrow=TRUE, ncol=ncol), 1, function(x) cat('"', paste(x, collapse='","'), '"\n', sep=""))
}
cat(f(readLines(file("stdin", "r"))))

コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« ホワイトデーのお返しの個数 | トップ | できる人のおちんぎんあっぷ »
最新の画像もっと見る

コメントを投稿

ブログラミング」カテゴリの最新記事