![]() |
Html agility pack
Подскажите почему не работает.Первый раз работаю со сторонними библиотеками посмотрел примеры, написал небольшую программу, но не работает.
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"); } } |
Что значит "не работает"? Ошибки, значения переменных, результат где?
|
Ругается на klo1 в цикле, мол ссылается на не существующий объект
|
DAmlex, давай весь проект в запакованном виде. + Ссылки на страницы загрузки компонентов.
Так же желательно инструкцию по получению ошибки. Имеющиеся пространные рассуждения не спасают. Цитата:
|
добавьте в using HtmlAgilityPack
|
|
|
Цитата:
И тем более, когда не добавлено, в ошибке написано что, возможно нужно добавить. Но правда, вот тут Цитата:
Тогда там явно не хватает библиотеки, как ferget Вы сказали. DAmlex, Предоставьте больше информации... |
Не надо везде пихать var, используй точные типы данных.
Насколько я помню, DocumentNode.SelectNodes("//title") вернет коллекцию узлов, и именно этот тип и надо указывать типом переменной. Узнать тип можно наведением мыши на функцию SelectNodes, высветится возвращаемый ею тип. А вообще по результатам поиска в гугле есть много интересного на эту тему. В частности, обсуждается вопрос, почему возвращается Null а не пустая коллекция, есть даже целый форум , посвященный этой библиотеке. Чуть не забыл. Не компилируется потому, скорее всего, что в C# тип данных var вычисляется немного отлично от обычных типов. пруфлинк - http://msdn.microsoft.com/ru-ru/library/bb383973.aspx Если уж так охота иметь "пространственную переменную", дай ей тип object, это даст гарантию, что не возникнет исключений и данную переменную можно будет впоследствии привести к любому нужному типу. Для этого в цикле надо будет добавить приведение типа примерно так foreach ((HtmlNode klo2 in (HtmlNodeCollection)klo1) |
Все гораздо проще я думаю.
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"); } |
Время: 09:51. |
Время: 09:51.
© OSzone.net 2001-