リファレンストップへ Java | htmlからリンクの一覧を取得使用した環境 JDK 6 Update 11 正規表現を使用して、htmlの中からリンクを探して一覧を抽出するサンプルです。以下のようなhtmlから、リンクの一覧を抽出してみます。 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>xxx</title> <link href="/xxx.css" rel="stylesheet" type="text/css" /> </head> <body> <div class="header"> ヘッダー </div> <div class="menu"> メニュー <a href="link1.html">リンク1</a> <a href="link2.html" class="aaa">リンク2</a> <a class="aaa" href="link3.html"> リンク3 </a> <a href="link4.html"> リンク4 </a> <a class="aaa" href="link5.html" id="xxx" > リンク5 </a> </div> <div class="content"> コンテンツ <a href="link6.html">リンク6</a> </div> <div class="footer"> フッター <a name="ccc" href="link7.html">リンク7</a> </div> </body> </html> htmlは様々な記述方法が想定されるので、わざとhref属性の位置をずらしたり、改行やスペースを入れていたりします。 リンクを抽出するソースは以下のようになります。 String html // 抽出対象のhtmlを保持するString Pattern ptn = Pattern.compile("<a.*?href=¥"(.*?)¥".*?>(.*?)</a>", Pattern.DOTALL); // (1) Matcher matcher = ptn.matcher(html); while (matcher.find()) { String href = matcher.group(1).replaceAll("¥¥s", ""); // (2) String text = matcher.group(2).replaceAll("¥¥s", ""); System.out.println("href=" + href + ", text=" + text); } (1) リンク抽出を行う正規表現のパターンです。href=に続くダブルクオーテーションで囲まれた文字列をグループ1に割り当てています。また、<a>と</a>の間をグループ2に割り当てます。Pattern.compileの第二引数に定数Pattern.DOTALLを指定する事により、改行もドット"."にマッチするように指定しています。 (2) マッチしたグループを取得しています。hrefの値と<a>と</a>の間のボディ部をそれぞれ取得しています。また、replaceAll("¥¥s", "")で改行やスペースやタブ文字などの除去を行っています。 結果は以下のようになります。 href=link1.html, text=リンク1 href=link2.html, text=リンク2 href=link3.html, text=リンク3 href=link4.html, text=リンク4 href=link5.html, text=リンク5 href=link6.html, text=リンク6 href=link7.html, text=リンク7 |
|