0

正規表現を使用して、ウェブサイトの HTML を取得し、このタグ内の値 (またはその属性の値) を見つける最も簡単な方法は何ですか?

<html>
  <head>
  [snip]
  <meta name="generator" value="thevalue i'm looking for" />
  [snip]
4

7 に答える 7

10

構築する必要がある Http リクエスト (認証など) の高度さに依存します。これは、私が過去に使用した簡単な方法の 1 つです。

StringBuilder html = new StringBuilder();
java.net.URL url = new URL("http://www.google.com/");
BufferedReader input = null;
try {
    input new BufferedReader(
        new InputStreamReader(url.openStream()));

    String htmlLine;
    while ((htmlLine=input.readLine())!=null) {
        html.appendLine(htmlLine);
    }
}
finally {
    input.close();
}

Pattern exp = Pattern.compile(
    "<meta name=\"generator\" value=\"([^\"]*)\" />");
Matcher matcher = exp.matcher(html.toString());
if(matcher.find())
{
    System.out.println("Generator: "+matcher.group(1));
}

おそらく、コンパイル時に多くのタイプミスが見つかるでしょう。(これが宿題じゃなかったらいいのに)

于 2008-08-28T00:38:16.360 に答える
4

HTMLでRegExを使用する問題に対処するときに、HTMLが整形式ではないことが多く、多くのHTMLパーサーが完全に役に立たなくなるという問題に誰も直面しないのは驚くべきことです。

Webページを分析するツールを開発していて、これらが整形式のHTMLではないという事実がある場合、「HTMLの解析に正規表現を使用しないでください」または「HTMLパーサーを使用する」という記述は完全に偽物です。事実は、現実の世界では、人々は自分が好きなようにHTMLを作成し、必ずしもパーサーに適しているとは限らないということです。

RegEx、テキスト、つまりHTMLの要素を見つけるための完全に有効な方法です。元のポスターが抱えている問題に立ち向かう他の合理的な方法がある場合は、「パーサーを使用する」または「RTFM」ステートメントを参照する代わりに、それらを投稿してください。

于 2010-12-16T22:02:39.357 に答える
1

XPath クエリを使用する必要があります。

の値を取得するのと同じくらい簡単です/html/head/meta[@name=generator]/@value

優れたチュートリアル: XPath を使用した XML ドキュメントの解析

于 2008-09-26T01:09:28.310 に答える
0

場合によります。

整形式のHTMLであることが保証されている1つまたは複数のサイトから情報を抽出していて、<meta>が何らかの方法で難読化されないことがわかっている場合は、<head>セクションを1行ずつ読み取り、正規表現は良いアプローチです。

一方、HTMLが壊れているか「トリッキー」である可能性がある場合は、適切なHTMLパーサー、場合によってはHTMLTidyのようなパーミッシブなHTMLパーサーを使用する必要があります。ランダムなWebサイトからトロールされたものに厳密なHTMLまたはXMLパーサーを使用することに注意してください。そこにある多くのいわゆるHTMLは、実際には不正な形式です。

于 2009-11-22T09:23:58.713 に答える
0

厳密に言えば、メタタグがコメントアウトされているか、メタタグが大文字である可能性があるため、正しい値を取得したかどうかを実際に確認することはできません。HTMLが「適切」と見なされるかどうかによって異なります。 "。

于 2008-09-19T11:07:23.793 に答える
0

Apache の org.apache.commons.HttpClient パッケージと関連パッケージのドキュメントは、こちら で確認できます。Java アプリケーションから HTTP リクエストを送信するのは非常に簡単です。ドキュメントをざっと見てみると、正しい方向に進むはずです。

于 2008-08-28T01:22:32.027 に答える
0

私はこれを試していませんが、基本的なフレームワークは

  1. 開くjava.net.HttpURLConnection
  2. を使用して入力ストリームを取得しますgetInputStream
  3. マイクの回答の正規表現を使用して、必要なビットを解析します
于 2008-08-28T01:26:26.227 に答える