Войти

Показать полную графическую версию : Html agility pack


DAmlex
31-08-2011, 18:53
Подскажите почему не работает.Первый раз работаю со сторонними библиотеками посмотрел примеры, написал небольшую программу, но не работает.
HtmlAgilityPack.HtmlDocument html = new HtmlAgilityPack.HtmlDocument();


html.LoadHtml("нужный сайт");

var klo1 = html.DocumentNode.SelectNodes("//title");
if (klo1 != null)
{
/
foreach (HtmlNode klo2 in klo1)
{
html.Save("result.html");
}
}

Delirium
01-09-2011, 10:58
Что значит "не работает"? Ошибки, значения переменных, результат где?

DAmlex
02-09-2011, 17:59
Ругается на klo1 в цикле, мол ссылается на не существующий объект

lxa85
02-09-2011, 18:54
DAmlex, давай весь проект в запакованном виде. + Ссылки на страницы загрузки компонентов.
Так же желательно инструкцию по получению ошибки.
Имеющиеся пространные рассуждения не спасают.
Ругается на klo1 в цикле, мол ссылается на не существующий объект »
Банальный вопрос. А объект существует? Если да, то с какими параметрами?

ferget
02-09-2011, 19:59
добавьте в using HtmlAgilityPack

LilLoco
03-09-2011, 10:39
добавьте в using HtmlAgilityPack »
Если бы была ошибка из - за отсутствия ее в using, проект бы не откомпилировался даже...
ссылается на не существующий объект »
В режиме отладки просто проверить какое "значение" у klo1, и уже будет понятнее...

ferget
03-09-2011, 10:59
Если бы была ошибка из - за отсутствия ее в using, проект бы не откомпилировался даже... »
а почему вы решили, что проект откомпилировался?

Ругается на klo1 в цикле, мол ссылается на не существующий объект »

LilLoco
03-09-2011, 12:23
а почему вы решили, что проект откомпилировался? »
Насколько я помню, такая ошибка появляется и при выполнении программы... Я так и подумал :-)

И тем более, когда не добавлено, в ошибке написано что, возможно нужно добавить.

Но правда, вот тут
foreach (HtmlNode klo2 in klo1) »
непонятно HtmlNode берется из HtmlAgilityPack?
Тогда там явно не хватает библиотеки, как ferget Вы сказали.

DAmlex, Предоставьте больше информации...

Delirium
03-09-2011, 14:00
Не надо везде пихать var, используй точные типы данных.
Насколько я помню, DocumentNode.SelectNodes("//title") вернет коллекцию узлов, и именно этот тип и надо указывать типом переменной. Узнать тип можно наведением мыши на функцию SelectNodes, высветится возвращаемый ею тип.

А вообще по результатам поиска (http://www.google.ru/#sclient=psy&hl=ru&newwindow=1&site=&source=hp&q=DocumentNode.SelectNodes&pbx=1&oq=DocumentNode.SelectNodes&aq=f&aqi=&aql=&gs_sm=e&gs_upl=0l0l0l931l0l0l0l0l0l0l0l0ll0l0&bav=on.2,or.r_gc.r_pw.&fp=6d29e03d3da2ab71&biw=1600&bih=779) в гугле есть много интересного на эту тему. В частности, обсуждается вопрос, почему возвращается Null а не пустая коллекция, есть даже целый форум (http://htmlagilitypack.codeplex.com/discussions) , посвященный этой библиотеке.

Чуть не забыл. Не компилируется потому, скорее всего, что в C# тип данных var вычисляется немного отлично от обычных типов. пруфлинк - http://msdn.microsoft.com/ru-ru/library/bb383973.aspx
Если уж так охота иметь "пространственную переменную", дай ей тип object, это даст гарантию, что не возникнет исключений и данную переменную можно будет впоследствии привести к любому нужному типу. Для этого в цикле надо будет добавить приведение типа примерно так
foreach ((HtmlNode klo2 in (HtmlNodeCollection)klo1)

Завернин Дмитрий
12-07-2013, 11:48
Все гораздо проще я думаю.
var klo1 = html.DocumentNode.SelectNodes("title"); //Слеши излишни, они не входят в название тэга, сам проверял.

//Дальше код будет работать логически неправильно, ибо вы проходите все заголовки по всем title и каждый раз сохраняете один и тот же html в один и тот же файл, хотя заголовков title может быть несколько в коллекции klo1. Если же только один заголовок title может быть, то конструкция foreach не имеет смысла. И если честно не понимаю в чем смысл программы. Если вы хотите сохранить html код всей страницы сайта, то зачем вообще нужна история с поиском title? Если же вы хотите сохранить именно сами html элементы title, то сохранять нужно сами элементы а не всю страницу в переменной html.
Надеюсь, что изложил свои мысли доступно и не излишне размазано=)

foreach (HtmlNode klo2 in klo1)
{
html.Save("result.html");
}




© OSzone.net 2001-2012