2013-11-16 4 views
0

Я использую HtmlAgilityPack для получения мета и описаний страницы. Поиск кода работает для простых веб-сайтов, таких как Tumblr., Twitter, Stack Overflow.Обновить страницу | facebook; показанный HtmlAgilityPack

Но когда я пытаюсь загрузить основные сайты, такие как Google, он показывает мне только название как Google и без описания. Similary для Facebook он не показывает мне описания, но для названия, которое показывает мне. Обновите свой браузер | Facebook.

Я новичок в этом пакете, я загрузил последнюю версию этого пакета из пакета NuGet в MS WebMatrix. Код, который я использую, равен:

@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); 
    } 
    } 
} 

Эта проблема по имени выглядит как старая проблема с браузером. Как это исправить?

+0

Возможно, вы захотите отправить строку User Agent, а не по умолчанию, которую передает платформа .NET ... См. Http://stackoverflow.com/a/11841680/736079. Что касается описания, отправленный HTML по facebook и google не содержит тега мета-описания, поэтому найти нечего. – jessehouwing

+0

О, это хорошая и новая информация для меня! :) Итак, что делают другие сайты? Скажем, Facebook. Они также используют описание Google. Как они его получают? Или они сами пишут? –

+0

Facebook, похоже, отправляет тег метаописания только тогда, когда вы не вошли в систему ... Когда вы исправляете строку UserAgent, они могут отправить вам ее. – jessehouwing

ответ

0

После долгого поиска я получил решение от Mike Brind на форумах ASP.NET.

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 ничего не возвращали мне. Когда я попытался включить некоторые поддельные заголовки, они дали мне детали, которые мне были нужны.

После этого было здорово!

Смежные вопросы