- PR -

正規表現でHTMLのリンクを検出

1
投稿者投稿内容
Shane
大ベテラン
会議室デビュー日: 2003/06/06
投稿数: 132
お住まい・勤務地: Vancouver, BC
投稿日時: 2005-01-07 06:06
以下のような HTML から、リンク先の URL (具体的には href/src の中身)
を取得する正規表現がうまくかけません。
<.* +(href|src)=('|\")(.*)('|\") *> としています。

WEBで検索しましたがわかりませんでした。
板違いかもしれませんが Java の正規表現ライブラリを使用しているということで、
どなたかわかる方お願いします。

[HTML]
<a href='test1.html'>
<img src='test2.gif'>
<img src='test3.gif' border='0'>
<img src='test4.gif' border='0'> 同じ行に2つ <img src='test5.gif' border='0'>

最下部のようなプログラムなのですが、
結果は以下のように、同じ行に別のクォートや別の href/src があると
だめなようです。

[プログラム結果]
url: test1.html
url: test2.gif
url: test3.gif' border='0
url: test5.gif' border='0

[プログラムコード]
public static void main(String[] s) {
String contents = "<a href='test1.html'>\n<img src='test2.gif'>\n<img src='test3.gif' border='0'>\n<img src='test4.gif' border='0'><img src='test5.gif' border='0'>";

Pattern pattern = Pattern.compile("<.* +(href|src)=('|\\\")(.*)('|\\\") *>");
//Pattern pattern = Pattern.compile("<.* +(href|src)=('|\\\")([^'|\\\"]*)('|\\\") *>");
Matcher matcher = pattern.matcher(contents);

while (matcher.find()) {
System.out.println("url: " + matcher.group(3));
}
}


[ メッセージ編集済み 編集者: Shin 編集日時 2005-01-07 06:07 ]
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2005-01-07 07:57
直接の答えではありませんが HttpUnit とかつかうとプログラムからリンクやフォームなどを簡単に抽出できますよ。
http://httpunit.sourceforge.net/
Shane
大ベテラン
会議室デビュー日: 2003/06/06
投稿数: 132
お住まい・勤務地: Vancouver, BC
投稿日時: 2005-01-07 08:38
引用:

インギさんの書き込み (2005-01-07 07:57) より:
直接の答えではありませんが HttpUnit とかつかうとプログラムからリンクやフォームなどを簡単に抽出できますよ。
http://httpunit.sourceforge.net/



レスありがとうございます。

HttpUnit を使って、確かに単純にリンクを取ることはできたのですが、
例えば
<script language="javascript src="link.js">
<style type="text/css" src="link.css">
のような場合もそれぞれ link.xxx ファイルを取ることはできなそうです。
もしできるようならそれで完璧なんですが。

前述した正規表現が期待通りに動けば、href/src を検出するんでそれでいいんですが。

koe
大ベテラン
会議室デビュー日: 2003/07/13
投稿数: 198
投稿日時: 2005-01-07 09:33
引用:

Shinさんの書き込み (2005-01-07 08:38) より:
HttpUnit を使って、確かに単純にリンクを取ることはできたのですが、
例えば
<script language="javascript src="link.js">
<style type="text/css" src="link.css">
のような場合もそれぞれ link.xxx ファイルを取ることはできなそうです。


「できない」と判断した理由はわかりませんが、WebResponse#getDOM()で
DOMツリーがもらえるので、それを使えばほとんどのことはできます。

コード:
WebConversation wc = new WebConversation();
WebResponse response = wc.getResponse("http://www.atmarkit.co.jp/");
NodeList nodeList = response.getDOM().getElementsByTagName("link");
for (int i = 0; i < nodeList.getLength(); i++) {
    NamedNodeMap nodeMap = nodeList.item(i).getAttributes();
    System.out.println(nodeMap.getNamedItem("href").getNodeValue());
}

takamaro
大ベテラン
会議室デビュー日: 2004/10/12
投稿数: 100
投稿日時: 2005-01-07 10:10
何故か私は今まで正規表現には縁の無い人生だったもので、多々問題もあろうかとは
思いますがJavaDoc参考に作ってみました。

コード:

Pattern pattern = Pattern.compile("<[^<]*\\s+(href|src)=(\'|\")([^(\'|\")]*)(\'|\")[^>]*>");



本来なら、もう少し細心の注意を払ったうえで記述すべきところなのでしょうが、
経験値が無いと「どこを注意すれば良いか」といった勘所が見えてこないもので。。。

まずは「なんとかなりそう」って感じの提案ということで(汗
Shane
大ベテラン
会議室デビュー日: 2003/06/06
投稿数: 132
お住まい・勤務地: Vancouver, BC
投稿日時: 2005-01-07 10:39
引用:

何故か私は今まで正規表現には縁の無い人生だったもので、多々問題もあろうかとは
思いますがJavaDoc参考に作ってみました。

コード:

Pattern pattern = Pattern.compile("<[^<]*\s+(href|src)=('|")([^('|")]*)('|")[^>]*>");



本来なら、もう少し細心の注意を払ったうえで記述すべきところなのでしょうが、
経験値が無いと「どこを注意すれば良いか」といった勘所が見えてこないもので。。。

まずは「なんとかなりそう」って感じの提案ということで(汗



できました。ありがとうございました。
(<form action= を含むため、 href|src|action としました)
私も正規表現はいつも避けてとおってますが、
時々必要なときはいつもWEB検索して拾ってきてます。
そろそろ勉強しようかな…。

引用:

「できない」と判断した理由はわかりませんが、WebResponse#getDOM()で
DOMツリーがもらえるので、それを使えばほとんどのことはできます。



ぱっと見楽にできる方法はないなと思いました。
今回は正規表現でシンプルにできそうだし、これで行こうと思います。
1

スキルアップ/キャリアアップ(JOB@IT)