質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.03%

特定ページの表をスプレッドシートに取得したい

受付中

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 1,871

Kodanosuke

score 17

 前提・実現したいこと

Googleスプレッドシートに、以下のページ内にあるにあるテキストをすべてを取り込みたいです。
http://www.ksbb.jp/schedule/2018/18-02-12.html
Google App Scriptでスプレッドシートないで処理するスクリプトを書いたことはありますが、外部のサイトから情報を取り込むことはしたことがありません。
どのようにしたら取り込めるかいちからご教授いただけませんでしょうか。
■■な機能を実装中に以下のエラーメッセージが発生しました。

 発生している問題・エラーメッセージ

エラーはありませんが、先へ進めていません。

 該当のソースコード

function myFunction() {
var urltemp = UrlFetchApp.fetch("http://www.ksbb.jp/schedule/2018/18-02-12.html");
var xml = urltemp.getContentText("shift-jis");
Logger.log(xml);
}

Google App Script

 試したこと

impothtmlの関数を使って取り込んでみようと試みましたが、クエリ、指数がよく分からず挫折しました。

 補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • jinshan

    2018/02/21 09:44 編集

    Webサイト表形式表示情報のスクレイピングをGASだけで実現した実例を持っているのですが、指定サイトは私の従業する環境では、アクセス禁止(娯楽関連)にひっかかって閲覧することができません。別の似たサイトを指定してくれれば、方法を提示できるかもしれません。

    キャンセル

  • Kodanosuke

    2018/02/27 12:47

    ありがとうございます。別の似たサイトとはどのようなサイトを指しているのでしょうか。UTFで記述された他のサイトということでしょうか。よろしくお願いします。

    キャンセル

回答 2

0

 できない原因

今回の問題は対象のWebサイトの文字エンコーディングがShift-JISになっている点です。
UTF-8であればスプレッドシートのA1に以下1行を指定するだけで目標が達成できていました。

IMPORTHTMLは残念ながら現時点でUTF-8のみに対応しておりShift-JISに対応していません。

=IMPORTHTML("http://www.ksbb.jp/schedule/2018/18-02-12.html","table",7)

 どうするか

GAS(Google App Script)を使いUrlFetchAppでHTMLを取得後Shift-JISとして読み取り、セルに値を入れるスクリプトを作る必要がありそうですが、私自身GASについて詳しく知らない上、Webサイトごとに個別に作る必要があり汎用的では無いので別の手法を紹介します。
(汎用的に作るとなるとそれなりのコード量になりそうです)

 やり方

1 convert.php を作る

<?php
$url = $_GET['url'];
$str = file_get_contents($url);
$str = mb_convert_encoding($str, 'utf8', 'shift_jis');
echo $str;

2 1を任意のサーバにアップロードする
3 スプレッドシートのA1に以下を指定する

=IMPORTHTML("http://SERVER_ADDRESS/convert.php?url=http://www.ksbb.jp/schedule/2018/18-02-12.html","table",7)

4 実行結果
イメージ説明

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/02/01 21:30

    回答いただきありがとうございます。
    大変申し訳ありませんが、当方phpに疎い状態です。
    phpのコードをどうやって書いてどこにアップロードするのかも教えていただけませんでしょうか。
    お手数をおかけしますがよろしくおねがいします。

    キャンセル

  • 2018/02/01 21:35

    完全に1からの説明になるので私には大きな負担となります。
    すみませんがこれ以上の説明はできかねます。
    他の回答者の回答をお待ち下さい。

    キャンセル

0

Xdomainあたりが易しいと思います。アカウントを作ったら、
管理パネルにログインし、
左サイドバーから「無料レンタルサーバー」をクリックし、次の画面で
PHP・MySQLサーバーの「管理バネルログイン」をクリックし、次の画面で
「FTPアカウント設定」をクリックし、次の画面で
WebFTPの下にあるログインボタンをクリックし、次の画面で
フォルダ/ファイル作成ボタンをクリックし、開いたダイアログボックスのなかで
utfconvert.phpなどと名前を入れて「ファイルを追加」をクリックして閉じて、
utfconvert.phpが出来ていたら鉛筆マークをクリックして編集画面に入り、

<?php
if (isset($_GET["url"])) {
$url = $_GET["url"];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$res = curl_exec($ch);
$html = mb_convert_encoding($res, "UTF-8", "SJIS");
echo $html;
curl_close($ch);
}
?>


とします(本当はfile_get_contents関数を使いたいがXdomainの場合、制限がかかっててこの関数はデフォルトでは使えない)。

そして最後にスプレッドシートに式を入れます。
=IMPORTHTML("http://アカウント名/utfconvert.php?url=http://www.ksbb.jp/schedule/2018/18-02-12.html","table",7)

アカウント名はFTPアカウント設定画面にある、xxxx.php.xdomain.jpです。

GASを使うなら、同じことですが

  var url = "http://アカウント名/utfconvert.php?url=http://www.ksbb.jp/schedule/2018/18-02-12.html";
  var response = UrlFetchApp.fetch(url, {muteHttpExceptions:true});
  if (response.getResponseCode() != 200) {
  return;
  }
  var body = response.getContentText();
  // 以下省略


のような感じになります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.03%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる