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

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

新規登録して質問してみよう
ただいま回答率
85.46%
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Q&A

解決済

1回答

1188閲覧

webスクレイピングで文字列を見やすくする

SotaUN

総合スコア17

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

0グッド

0クリップ

投稿2020/06/02 08:59

前提・実現したいこと

GAS(google apps script)で、webスクレイピングをしようと思っています。
該当のwebサイトから取得する文字列には、**<p><li>**などのHTMLの記号が含まれていますが、それらを取り除いて読みやすい形にしたいです。

該当のソースコード

javascript

1function myFunction() { 2 /////①URLの指定///// 3 var url = "https://atcoder.jp/contests/agc044/tasks/agc044_a"; 4 /////②HTMLテキストの取得///// 5 var response = UrlFetchApp.fetch(url); 6 var html = response.getContentText('UTF-8'); 7 /////③タイトルタグの抽出///// 8 //開始文字列の指定 9 var start_str = "<section>"; 10 var start_num = html.indexOf(start_str)+start_str.length; 11 //終了文字列の指定 12 var end_str = "</section>"; 13 var end_num = html.indexOf(end_str); 14 //タイトルタグをスクレイピング 15 var title = html.substring(start_num, end_num); 16 17 //ここに文字列をきれいにする処理を書く 18 19 //結果の出力 20 console.log(title); 21}

試したこと

該当の文字列を順番に見ていき、**"<"">"**で囲まれている部分を順番に削除して行こうと思いましたが、厳密でなく、時間もかかるので、何かいい方法があれば教えていただきたいです。

補足情報

ちなみに、AtcoderのURLから、問題文を出力するというプログラムです。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

厳密かは分かりませんが、正規表現を使った.replaceをすれば出来るかと思います。以下がサンプルです。

Javascript

1//タグが,</h1>,</h2>,</h3>等の場合、改行に置き換えます。 2var txt = title.replace(/</h\d+>/ig, "\n"); 3//タグを消します。<p>,</p>など全部。 4txt = txt.replace(/<\w+[^>]*>|</\w+>/g, ""); 5

GAS

1function myFunction() { 2 /////①URLの指定///// 3 var url = "https://atcoder.jp/contests/abc162/tasks/abc162_a"; 4 /////②HTMLテキストの取得///// 5 var response = UrlFetchApp.fetch(url); 6 var html = response.getContentText("UTF-8"); 7 /////③タイトルタグの抽出///// 8 //開始文字列の指定 9 var start_str = "<section>"; 10 var start_num = html.indexOf(start_str) + start_str.length; 11 //終了文字列の指定 12 var end_str = "</section>"; 13 var end_num = html.indexOf(end_str); 14 //タイトルタグをスクレイピング 15 var title = html.substring(start_num, end_num); 16 17 //ここに文字列をきれいにする処理を書く 18 19 //タグが,</h1>,</h2>,</h3>等の場合、改行に置き換えます。 20 var txt = title.replace(/</h\d+>/ig,"\n"); 21 //タグを消します。<p>,</p>など全部。 22 txt = txt.replace(/<\w+[^>]*>|</\w+>/g, ""); 23 Logger.log(txt); 24 25 //結果の出力 26 Logger.log(title); 27} 28

投稿2020/06/02 12:15

編集2020/06/02 12:17
fake_shibe

総合スコア806

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SotaUN

2020/06/02 12:48

とても役に立ちました!ありがとうございます!
SotaUN

2020/06/02 12:49

ところで、 txt = txt.replace(/<\w+[^>]*>|</\w+>/g, ""); の部分では、全てのタグを除くというどのような処理をしているのでしょうか。 可能な範囲で教えていただければ幸いです。
fake_shibe

2020/06/02 13:22

txt.replace(/<\w+[^>]*>|</\w+>/g, ""); は、正規表現で一致した文字を""(削除してます)に置き換えています。 /<\w+[^>]*>|</\w+>/gの正規表現ですが、 <\w+[^>]*>でタグの始まりの部分の、<h1>,<p>,<a href="https://hoge.com">に一致します。 | は or です。 </\w+>で終了タグ</h1>,</p>,</a>などに一致します。 上で一致した部分を全部削除(""に置き換えてます)しています。
SotaUN

2020/06/03 10:23

ご丁寧にありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問