无需在浏览器中加载即可通过编程方式读取任何页面的 Meta 标签






3.86/5 (3投票s)
在本文中,我将向您展示如何使用 C# 和 Asp.Net 以编程方式读取 meta 标签。本文与其他文章的区别在于
在本文中,我将向您展示如何使用 C# 和 Asp.Net 以编程方式读取 meta 标签。本文与其他文章的区别在于,互联网上所有可用的样本都谈论从页面本身读取和写入标签,但在本文中,我们将采用动态下载页面内容并从中读取 meta 标签的方法。
首先,我们需要下载页面内容,而无需将其加载到浏览器中。为此,我们将使用 WebRequest 类。下面的代码使用默认凭据创建一个对“http://www.microsoft.com/en/us/default.aspx”的请求。
// 为 URL 创建一个请求。
WebRequest request = WebRequest.Create("http://www.microsoft.com/en/us/default.aspx");
// 如果服务器需要,请设置凭据。
request.Credentials = CredentialCache.DefaultCredentials;
现在我们已准备好从客户端获取响应。为了接收响应,我们将使用 WebResponse 类,如下所示:
// 获取响应。
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
获取响应后,我们希望将其加载到 HTML DOM 中。正如您应该知道的,HTML 使用 DOM 模型加载文档。因此,在接下来的几行中,我们将以字符串形式获取响应,并使用该字符串来加载 IHTMLDocument2 类。
// 获取包含服务器返回的内容的流。
Stream dataStream = response.GetResponseStream();
// 使用 StreamReader 打开流以便于访问。
StreamReader reader = new StreamReader(dataStream);
// 读取内容。
string responseFromServer = reader.ReadToEnd();
//将 html 读取到 html 文档中以便解析
IHTMLDocument2 doc = new HTMLDocumentClass();
doc.write(new object[] { responseFromServer });
doc.close();
现在,我们已经将整个页面加载到内存中,形式为 HtmlDocument,我们将遍历它并从中检索 Meta 标签。
// 循环遍历文档中的每个元素,以检查它是否符合设置属性的条件
foreach (IHTMLElement el in (IHTMLElementCollection)doc.all)
{
// 检查是否找到了所有期望的属性及其正确的值
bool qualify = true;
if (el.tagName == "META")
{
HTMLMetaElement meta = (HTMLMetaElement)el;
Response.Write("Content " + meta.content + "<br/>");
}
}
当然,您还可以使用上面的代码做更多的事情。但这些将在其他文章中讨论。供您参考,我将完整的代码粘贴在下面。要使示例正常工作,请通过以下方式添加对 mshtml 的引用:
步骤:-
1.)在解决方案资源管理器中,突出显示要添加解析功能的项目。
2.)在菜单中,单击项目 -> 添加引用。
3.)在显示的对话框中,在“.Net”选项卡下,选择 Microsoft.mshtml 程序集。
4.)单击“选择”按钮,然后单击“确定”按钮。
现在我们可以引用此程序集。
不要忘记添加命名空间:
using mshtml;
Response.Write("Button2_Click");
// 为 URL 创建一个请求。
WebRequest request = WebRequest.Create("http://www.microsoft.com/en/us/default.aspx");
// 如果服务器需要,请设置凭据。
request.Credentials = CredentialCache.DefaultCredentials;
// 获取响应。
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
// 显示状态。
Console.WriteLine(response.StatusDescription);
// 获取包含服务器返回的内容的流。
Stream dataStream = response.GetResponseStream();
// 使用 StreamReader 打开流以便于访问。
StreamReader reader = new StreamReader(dataStream);
// 读取内容。
string responseFromServer = reader.ReadToEnd();
// 显示内容。
Console.WriteLine(responseFromServer);
// 清理流和响应。
reader.Close();
dataStream.Close();
response.Close();
//将 html 读取到 html 文档中以便解析
IHTMLDocument2 doc = new HTMLDocumentClass();
doc.write(new object[] { responseFromServer });
doc.close();
// 循环遍历文档中的每个元素,以检查它是否符合设置属性的条件
foreach (IHTMLElement el in (IHTMLElementCollection)doc.all)
{
// 检查是否找到了所有期望的属性及其正确的值
bool qualify = true;
if (el.tagName == "META")
{
HTMLMetaElement meta = (HTMLMetaElement)el;
Response.Write("Content " + meta.content + "<br/>");
}
}