Самый простой способ извлечь метатеги из загруженного файла HTML - PullRequest
1 голос
/ 04 марта 2012

Мне нужно проанализировать веб-страницу на 2 значения метатега. Я не уверен, какой самый эффективный способ проанализировать html веб-страницы для данных метатега.

Могу ли я преобразовать HTML-строку веб-страниц в xml, а затем проанализировать тег типа meta?

WebClient wc = new WebClient();
wc.Headers.Set("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.19) Gecko/2010031422 Firefox/3.0.19 ( .NET CLR 3.5.30729; .NET4.0E)");
string html  = wc.DownloadString(String.Format("http://www.geobytes.com/IpLocator.htm?GetLocation&template=php3.txt&IpAddress={0}", ip));
XmlDocument xdoc = new XmlDocument();
xdoc.LoadXml(html);   // ERROR HERE: "The 'meta' start tag on line 23 position 2 does not match the end tag of 'head'. Line 26, position 3"
XmlNodeList interNode = xdoc.DocumentElement.SelectNodes("//meta");

Я не знаком со всеми библиотеками C #, есть ли лучшая альтернатива, которой было бы проще получить все метатеги из возвращенного HTML

Также я получаю сообщение об ошибке при попытке разобрать html:

Начальный тег meta в строке 23 позиции 2 не соответствует конечному тегу «головы». Линия 26, позиция 3

Ответы [ 2 ]

3 голосов
/ 05 марта 2012

Я бы рекомендовал HTML Agility Pack .Он хорошо обрабатывает искаженный HTML, давая вам возможность XPath изолировать узлы / значения.

Ваш выбор будет аналогичен (при использовании .Net 4.0):

var nodes = doc.DocumentNode.SelectNodes("//meta");
0 голосов
/ 04 марта 2012

Вы можете использовать синтаксический анализатор HTML вместо синтаксического анализатора XML, вы можете манипулировать строкой перед ее синтаксическим анализом как XML, или вы можете просто использовать регулярные выражения.Они подходят для такой ситуации.Итак, предположим, что System.Text.RegularExpressions импортировано:

Regex metaTag = new Regex(@"<meta name=\"(.+?)\" content=\"(.+?)\">");
Dictionary<string, string> metaInformation = new Dictionary<string, string>();

foreach(Match m in metaTag.Matches(html)) {
    metaInformation.Add(m.Groups[1].Value, m.Groups[2].Value);
}

Теперь вы можете просто получить доступ к любым метаданным как metaInformation["meta name"].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...