PGBox
P
G
Box

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





正規表現のメニューへ戻る