- - PR -
正規表現でHTMLのリンクを検出
1
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 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 ] | ||||||||||||
|
投稿日時: 2005-01-07 07:57
直接の答えではありませんが HttpUnit とかつかうとプログラムからリンクやフォームなどを簡単に抽出できますよ。
http://httpunit.sourceforge.net/ | ||||||||||||
|
投稿日時: 2005-01-07 08:38
レスありがとうございます。 HttpUnit を使って、確かに単純にリンクを取ることはできたのですが、 例えば <script language="javascript src="link.js"> <style type="text/css" src="link.css"> のような場合もそれぞれ link.xxx ファイルを取ることはできなそうです。 もしできるようならそれで完璧なんですが。 前述した正規表現が期待通りに動けば、href/src を検出するんでそれでいいんですが。 | ||||||||||||
|
投稿日時: 2005-01-07 09:33
「できない」と判断した理由はわかりませんが、WebResponse#getDOM()で DOMツリーがもらえるので、それを使えばほとんどのことはできます。
| ||||||||||||
|
投稿日時: 2005-01-07 10:10
何故か私は今まで正規表現には縁の無い人生だったもので、多々問題もあろうかとは
思いますがJavaDoc参考に作ってみました。
本来なら、もう少し細心の注意を払ったうえで記述すべきところなのでしょうが、 経験値が無いと「どこを注意すれば良いか」といった勘所が見えてこないもので。。。 まずは「なんとかなりそう」って感じの提案ということで(汗 | ||||||||||||
|
投稿日時: 2005-01-07 10:39
できました。ありがとうございました。 (<form action= を含むため、 href|src|action としました) 私も正規表現はいつも避けてとおってますが、 時々必要なときはいつもWEB検索して拾ってきてます。 そろそろ勉強しようかな…。
ぱっと見楽にできる方法はないなと思いました。 今回は正規表現でシンプルにできそうだし、これで行こうと思います。 |
1