Perlの正規表現を使って、HTMLの中にあるJavascript部分を取り除いてみた。
HTMLの中のコンテンツ部分だけ抽出したい、という欲望がムクムクと湧いてきたのでPerlの正規表現で書いてみました。これまでも、HTMLタグを取り除く処理は書いたことあるんですが、「欲張りでない量指定子」(Non-Greedy Matches)が理解できてなかったので、Javascriptの中身が残ってしまうといった失敗をしていました。『初めてのPerl』(リャマ本)7章~9章を読み直して、だいぶ理解できた気がする。
#!/usr/bin/env perl use strict; use warnings; use utf8; use feature qw/say/; use Encode qw/encode/; my $html; while(<DATA>){ chomp; $html .= $_; } # javascript部分を除去 $html =~ s#<script.*?>.*?</script>##gis; # Windowsコマンドプロンプトに出力するのでCP932にエンコード say encode('cp932', $html); __DATA__ <!DOCTYPE html> <html> <head> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>Perlの正規表現、ステキやん。</title> <meta charset="utf-8"> <meta name="description" content="Perlの正規表現は強力です。文字列処理がはかどりまくり。"> <meta name="author" content="kamiokan"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" href=""> <!--[if lt IE 9]> <script src="//cdn.jsdelivr.net/html5shiv/3.7.2/html5shiv.min.js"></script> <script src="//cdnjs.cloudflare.com/ajax/libs/respond.js/1.4.2/respond.min.js"></script> <![endif]--> <link rel="shortcut icon" href=""> </head> <body> コンテンツ部分。 Perlの正規表現は強力です:) <script src="./hoge.js" type="text/javascript"></script> <script> Javascript... </script> <!-- <script> Javascript... </script> --> <script type="text/javascript"> Javascript... </script> </body> </html>
↑よく目にするHTML内のJavascriptの記述を数パターン用意してあります。ごく稀にですが、Javascript部分のタグを「SCRIPT」という風に大文字で書く猛者がいるので、/i修飾子を付けてあります。
<!DOCTYPE html><html><head><meta http-equiv="X-UA-Compatible" content="IE=edge"><title>Perlの正規表現、ステキやん。</title><meta charset="utf-8"><meta name="descri ption" content="Perlの正規表現は強力です。文字列処理がはかどりまくり。"><meta name="author" content="kamiokan"><meta name="viewport" content="width=device-width, i nitial-scale=1"><link rel="stylesheet" href=""><!--[if lt IE 9]><![endif]--><link rel="shortcut icon" href=""></head><body>コンテンツ部分。Perlの正規表現は強力です :)<!----></body></html>
↑結果はこんな感じです。Javascript部分が綺麗に取り除けました。
#!/usr/bin/env perl use strict; use warnings; use utf8; use feature qw/say/; use Encode qw/encode/; my $html; while(<DATA>){ chomp; $html .= $_; } # コメント部分も除去 $html =~ s#<!--.*?-->##gs; # javascript部分を除去 $html =~ s#<script.*?>.*?</script>##gis; # htmlタグも除去 $html =~ s#</?.*?>##gs; # Windowsコマンドプロンプトに出力するのでCP932にエンコード say encode('cp932', $html); __DATA__ <!DOCTYPE html> <html> <head> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>Perlの正規表現、ステキやん。</title> <meta charset="utf-8"> <meta name="description" content="Perlの正規表現は強力です。文字列処理がはかどりまくり。"> <meta name="author" content="kamiokan"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" href=""> <!--[if lt IE 9]> <script src="//cdn.jsdelivr.net/html5shiv/3.7.2/html5shiv.min.js"></script> <script src="//cdnjs.cloudflare.com/ajax/libs/respond.js/1.4.2/respond.min.js"></script> <![endif]--> <link rel="shortcut icon" href=""> </head> <body> コンテンツ部分。 Perlの正規表現は強力です:) <script src="./hoge.js" type="text/javascript"></script> <script> Javascript... </script> <!-- <script> Javascript... </script> --> <script type="text/javascript"> Javascript... </script> </body> </html>
↑せっかくなので、HTMLタグとかも除去します。
Perlの正規表現、ステキやん。コンテンツ部分。Perlの正規表現は強力です:)
↑結果はコチラ。コンテンツだけキレイに抜き取ることができました。
Perlは本当に手軽で便利だから好きです。