7

Web ページのタイトルを取得して文字列として保存できるメソッドを探しています。

ただし、これまでに見つけたすべての解決策には、ページのソース コードをダウンロードすることが含まれており、これは多数の Web ページに対して実際には実用的ではありません。

私が見ることができる唯一の方法は、文字列の長さを制限するか、設定された数の文字のみをダウンロードするか、タグに到達すると停止することですが、これは明らかにまだかなり大きくなりますか?

ありがとう

4

2 に答える 2

19

<title>タグは HTML 自体にあるため、「タイトルだけ」を見つけるためにファイルをダウンロードしない方法はありません<title>タグを読み込むまでファイルの一部をダウンロードするか、タグを読み込んでから停止できるはずですが、</head>それでもファイル (少なくとも一部) をダウンロードする必要があります。

これは、HttpWebRequest/と、ブロックまたはタグHttpWebResponseを読み取るまで、応答ストリームからデータを読み取ることで実現できます。タグ チェックを追加したのは、有効な HTML ではタイトル ブロックがヘッド ブロック内に表示される必要があるためです。したがって、このチェックでは、いかなる場合でもファイル全体を解析することはありません (もちろん、ヘッド ブロックがない場合を除きます)。<title></title></head></head>

以下は、このタスクを達成できるはずです。

string title = "";
try {
    HttpWebRequest request = (HttpWebRequest.Create(url) as HttpWebRequest);
    HttpWebResponse response = (request.GetResponse() as HttpWebResponse);

    using (Stream stream = response.GetResponseStream()) {
        // compiled regex to check for <title></title> block
        Regex titleCheck = new Regex(@"<title>\s*(.+?)\s*</title>", RegexOptions.Compiled | RegexOptions.IgnoreCase);
        int bytesToRead = 8092;
        byte[] buffer = new byte[bytesToRead];
        string contents = "";
        int length = 0;
        while ((length = stream.Read(buffer, 0, bytesToRead)) > 0) {
            // convert the byte-array to a string and add it to the rest of the
            // contents that have been downloaded so far
            contents += Encoding.UTF8.GetString(buffer, 0, length);

            Match m = titleCheck.Match(contents);
            if (m.Success) {
                // we found a <title></title> match =]
                title = m.Groups[1].Value.ToString();
                break;
            } else if (contents.Contains("</head>")) {
                // reached end of head-block; no title found =[
                break;
            }
        }
    }
} catch (Exception e) {
    Console.WriteLine(e);
}

更新:元の source-example を更新して、効率と保守性を向上させるためにコンパイル済みRegexおよびusingステートメントを使用するようにしました。Stream

于 2012-07-25T15:29:19.213 に答える
2

これを処理する簡単な方法は、ダウンロードしてから分割することです。

    using System;
    using System.Net.Http;

    private async void getSite(string url)
    {
        HttpClient hc = new HttpClient();
        HttpResponseMessage response = await hc.GetAsync(new Uri(url, UriKind.Absolute));
        string source = await response.Content.ReadAsStringAsync();

        //process the source here

    }

ソースを処理するには、 HTMLタグ間からコンテンツを取得するに関する記事で説明されている方法を使用できます

于 2012-10-04T01:43:52.507 に答える