【问题标题】:Update your browser | Facebook; shown by HtmlAgilityPack更新您的浏览器 | Facebook;由 HtmlAgilityPack 显示
【发布时间】:2013-11-16 16:52:40
【问题描述】:

我正在使用 HtmlAgilityPack 来获取页面的元描述和其他描述。该代码适用于Tumblr.TwitterStack Overflow等简单网站。

但是当我尝试加载主要网站时,例如Google,它只显示了一个 Google 标题,没有描述标签。 Facebook 类似,它没有显示任何描述,但它显示的标题更新您的浏览器 |脸书。

我是这个包的新手,我从 MS WebMatrix 的 NuGet 包下载了它的最新版本。我使用的代码如下:

@using HtmlAgilityPack;
@{
  Layout = "~/_SiteLayout.cshtml";
  var Title = "";
  var Description = "";
  using(var client = new WebClient()){
    var html = client.DownloadString("http://www.facebook.com");
    var doc = new HtmlDocument();
    doc.LoadHtml(html);
    var title = doc.DocumentNode.Descendants("title").FirstOrDefault();
    if(title != null){
        Title = title.InnerText;
    }
    var description = doc.DocumentNode.Descendants("meta")
                                      .Where(n => n.GetAttributeValue("name", String.Empty)
                                      .Contains("description")).FirstOrDefault();
    if(description != null){
        Description = description.GetAttributeValue("content", string.Empty);
    }
  }
}

这个问题,顾名思义,看起来像是一个旧的浏览器问题。如何解决这个问题?

【问题讨论】:

  • 您可能想发送一个用户代理字符串,而不是 .NET 框架发送的默认字符串...参见:stackoverflow.com/a/11841680/736079 至于描述,facebook 和 google 发出的 HTML 没有'不包含元描述标签,所以没有什么可找到的。
  • 哦,这对我来说是一个很好的新信息! :) 那么,其他网站是做什么的呢?让我们说Facebook。他们也分享了谷歌的描述。他们如何获取它?还是他们自己写的?
  • Facebook 似乎仅在您未登录时才会发送元描述标签...当您修复 UserAgent 字符串时,他们实际上可能会向您发送一个。
  • 噢!让我试试吧! :) 但他们仍然没有发送任何内容。

标签: html-agility-pack


【解决方案1】:

为此找了很久,我在 ASP.NET 论坛上从 Mike Brind 那里得到了解决方案。

var Image = "";
using(var client = new WebClient()){
    client.Headers.Add("user-agent", "Mozilla/5.0 (Windows NT 6.3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36");
    client.Headers.Add("method", "GET");
    client.Headers.Add("version", "HTML/1.1");
    client.Headers.Add("accept",
    "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
    var html = client.DownloadString("http://www.google.com");
    var doc = new HtmlDocument();
    doc.LoadHtml(html);
    var title = doc.DocumentNode.Descendants("title").FirstOrDefault();
    if(title != null){
        Title = title.InnerText;
    }
    var description = doc.DocumentNode.Descendants("meta")
                                      .Where(n => n.GetAttributeValue("name", String.Empty)
                                      .Contains("description")).FirstOrDefault();
    if(description != null){
        Description = description.GetAttributeValue("content", string.Empty);
    }
    var image = doc.DocumentNode.Descendants("link")
                                .Where(n => n.GetAttributeValue("rel", String.Empty)
                                .Contains("shortcut icon")).FirstOrDefault();
    if(image != null) {
        Image = image.GetAttributeValue("href", string.Empty);
    }
}

这是执行此操作所需的代码。实际上主要的是,当这个人从他的计算机创建一个新请求时,浏览器会向服务器发送一些细节,而我没有发送任何东西。这就是为什么 Facebook 和 Google 没有向我返回任何东西的原因。当我试图包含一些假标题时,他们给了我我需要的详细信息。

在那之后,一切顺利!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-03
    • 1970-01-01
    • 1970-01-01
    • 2013-02-02
    • 2015-04-03
    • 2018-08-15
    相关资源
    最近更新 更多