Как прочитать заголовок внешней страницы? - PullRequest
3 голосов
/ 01 марта 2009

Я думаю, что это возможно с jQuery, но любой серверный код ASP.NET подходит и для моей ситуации.

С помощью jQuery я могу загрузить страницу, например, в div, и отфильтровать div для тега <title>, но я думаю, что для тяжелых страниц сначала не нужно читать все содержимое, а затем читать заголовок .. а может у него очень простое решение? Во всяком случае, я не мог найти что-нибудь об этом из Интернета. спасибо

Ответы [ 7 ]

2 голосов
/ 01 марта 2009

cjjer почти понял все правильно.

Сначала измените регулярное выражение на: <title>(?<Content>.*?)?</title>

Во-вторых, сначала вам нужно создать соответствующий объект (на тот случай, если у вашего URI нет заголовка).

Match tMatch = new RegEx(@"<title>(?<Content>.*?)?</title>").Match(new System.Net.WebClient().DownloadString(url));

if ((null != tMatch) && (tMatch.IsSuccess)) {
    //  yay.
    title = tMatch.Groups("Content").value;
}
2 голосов
/ 02 марта 2009

хорошо, благодаря cjjer и Boo, я только что прочитал больше о регулярных выражениях, и, наконец, приведенный ниже код работает для меня.

Dim qq As New System.Net.WebClient
    Dim theuri As New Uri(TextBox1.Text)
    Dim res As String = qq.DownloadString(theuri)
    Dim re As Regex = New Regex("<title\b[^>]*>(.*?)</title>", RegexOptions.Singleline)
    Dim ma As Match = re.Match(res)


    If Not ma Is Nothing And ma.Success Then
        Response.Write(ma.Groups(1).Value.ToString())
    Else
        Response.Write("error")
    End If

но в любом случае проблема остается: этот код загружает всю страницу и просматривает ее, какие тяжелые сайты заняли более 2 или 3 секунды, но, насколько я знаю, это единственный путь: | Есть какие-нибудь предложения по улучшению этого кода?

1 голос
/ 01 марта 2009

Заголовки обычно появляются в первых нескольких сотнях байтов, так что вы можете попробовать запрос диапазона для первых 1 КБ или около того, попробуйте выполнить синтаксический анализ (с анализатором с исправлением ошибок, поскольку некоторые закрывающие теги будут отсутствовать), и если это не удастся вернуться к загрузке всей страницы.

0 голосов
/ 01 марта 2009

Я не уверен, что все серверы поддерживают это.
Посмотрите, поможет ли это


char[] data = new char[299];
System.Net.HttpWebRequest wr =(HttpWebRequest)WebRequest.Create("http://www.yahoo.com");
wr.AddRange("bytes", 0, 299);
HttpWebResponse wre = (HttpWebResponse)wr.GetResponse();
StreamReader sr = new StreamReader(wre.GetResponseStream());
sr.Read(data, 0, 299);
Console.WriteLine((data));
sr.Close();

РЕДАКТИРОВАТЬ: попробуйте проверить с помощью какого-либо инструмента мониторинга сети, чтобы узнать, какой текст отправляют серверы. Я использовал Fiddler, чтобы увидеть вывод и записал его в консоль.

EDIT2: я предполагаю, что заголовок находится в начале страницы.

0 голосов
/ 01 марта 2009
string title=Regex.Match(new System.Net.WebClient().DownloadString(url),(@"<title>(.*?)</title>"))[0].Groups[1].ToString();

попробуй. Я не уверен.

0 голосов
/ 01 марта 2009

Нет простого простого способа получить заголовок внешней страницы. Вы можете сделать это на стороне сервера, используя WebClient и анализируя ответ.

Однако, возможно, стоит пересмотреть требование, действительно ли это необходимо, сколько дополнительного трафика и задержек он будет генерировать. Также учтите, что вы можете генерировать нагрузку на внешний сайт, который не знает, все, что вам нужно, это заголовок, создание страницы может быть довольно дорогим.

0 голосов
/ 01 марта 2009

Для вас было бы угрозой безопасности загрузить любую другую веб-страницу в вашу, только для чтения заголовка ... Вы должны сделать это с помощью сценариев на стороне сервера (asp.net, php, ...) и просто вывести заголовок на вашу веб-страницу. Что-то вроде кеширования, потому что можно легко получать заголовки при каждом запросе.

...