【问题标题】:Read only the title and/or META tag of HTML file, without loading complete HTML file只读取 HTML 文件的标题和/或 META 标签,不加载完整的 HTML 文件
【发布时间】:2011-08-03 18:48:38
【问题描述】:

场景:

我需要解析数百万个 HTML 文件/页面(尽我所能)然后只读取其中的标题或元部分并将其转储到数据库

我正在做的是使用System.Net.WebClient 类的DownloadString(url_path) 下载然后通过 LINQ To SQL 将其保存到数据库

但是这个DownloadString函数给了我完整的html源代码,我只需要标题部分和META标签部分。

有什么想法,只下载这么多内容吗?

【问题讨论】:

    标签: c# .net asp.net html webclient


    【解决方案1】:

    我认为您可以使用此 url 打开一个流并使用此流读取前 x 个字节,我无法说出确切的数字,但我认为您可以将其设置为合理的数字以获取标题和描述。

    HttpWebRequest fileToDownload = (HttpWebRequest)HttpWebRequest.Create("YourURL");
                using (WebResponse fileDownloadResponse = fileToDownload.GetResponse())
                {
                    using (Stream fileStream = fileDownloadResponse.GetResponseStream())
                    {
                        using (StreamReader fileStreamReader = new StreamReader(fileStream))
                        {
                            char[] x = new char[Number];
                            fileStreamReader.Read(x, 0, Number);
                            string data = "";
                            foreach (char item in x)
                            {
                                data += item.ToString();
                            }
                        }
                    }
                }
    

    【讨论】:

    • 你能推荐一个关于如何获得 Stream 的例子吗?它对性能有帮助吗?
    • 我用我想告诉你的想法更新了代码
    【解决方案2】:

    我怀疑 WebClient 会首先尝试下载整个页面,在这种情况下,您可能需要一个原始客户端套接字。发送适当的 HTTP 请求(手动,因为您使用的是原始套接字),开始读取响应(不会立即)并在您阅读足够多时终止连接。但是,其余的可能已经从服务器发送,并且无论您是否愿意,都可能已经发送到您的 PC,因此您可能不会节省太多(如果有的话)带宽。

    根据您的需要,许多半体面的网站都有一个自定义 404 页面,它比已知页面简单得多。是否有你想要的信息是另一回事。

    【讨论】:

      【解决方案3】:

      您可以在 HttpWebRequest 中使用动词“HEAD”来返回响应标头(不是元素。要获取包含元数据的完整元素,您需要下载页面并解析出所需的元数据。

      System.Net.WebRequest.Create(uri) { Method = "HEAD" };
      

      【讨论】:

      • 这对性能有帮助吗,或者在后台它可能会下载整个页面?
      • HEAD 只返回响应头;这意味着如果 HTML 元标记不是响应标头的一部分,则不会被覆盖,因为 HTML 位于响应正文中。
      • 这不起作用,因为它只返回 http 标头。不是 html 的头部:w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.4
      • BoltClock 是正确的,元标签很可能不会存在...只需快速模拟一下,看看它们是否返回到您的页面,如果没有,那么您需要下载页。最有可能的是,您最终不得不下载页面和/或解析响应流,直到获得包含所需数据的 元素。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-07
      • 1970-01-01
      • 2013-04-15
      • 2011-10-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多