如何在不下载所有页面源的情况下获取网页标题

我正在寻找一种方法,可以让我获得网页的标题并将其存储为字符串。

但是到目前为止我找到的所有解决方案都涉及下载页面的源代码,这对于大量网页来说并不实用。

我能看到的唯一方法是限制字符串的长度,或者只有当它到达标签时才下载一定数量的字符或停止,但这显然仍然会非常大?

谢谢

由于标签位于HTML本身,因此无法下载文件以找到“只是标题”。 你应该可以下载文件的一部分,直到你读入标签或标签然后停止,但你仍然需要下载(至少一部分)文件。

这可以通过HttpWebRequest / HttpWebResponse完成,并从响应流中读取数据,直到我们读入块或标记。 我添加了标签检查,因为在有效的HTML中,标题栏必须出现在头部块中 – 因此,通过此检查,我们将永远不会解析整个文件(当然,除非没有头部块,否则)。

以下应该可以完成此任务:

 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  block Regex titleCheck = new Regex(@"\s*(.+?)\s*", 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  match =] title = m.Groups[1].Value.ToString(); break; } else if (contents.Contains("")) { // reached end of head-block; no title found =[ break; } } } } catch (Exception e) { Console.WriteLine(e); } 

更新:更新了原始源代码示例,以便为Stream使用已编译的Regexusing语句,以提高效率和可维护性。

处理此问题的一种更简单的方法是下载它,然后拆分:

  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标记之间获取内容 ”一文中所述的方法