Разбор HTML-документа Получить все поля ввода с идентификатором и значением
У меня есть несколько тысяч (ASP.net - грязный HTML) счетов, сгенерированных HTML, которые я пытаюсь проанализировать и сохранить в базе данных.
В основном, как:
foreach(var htmlDoc in HtmlFolder)
{
foreach(var inputBox in htmlDoc)
{
//Make Collection of ID and Values Insert to DB
}
}
Из всех остальных вопросов, которые я прочитал, лучшим инструментом для решения подобных проблем является HtmlAgilityPack, однако я не могу заставить работать файл документации.chm. Любые идеи о том, как я мог бы сделать это с или без Agility Pack?
заранее спасибо
4 ответа
Более новой альтернативой HtmlAgilityPack является CsQuery. Посмотрите на этот вопрос о достоинствах относительной производительности, но использование CSS-селекторов невозможно:
var doc = CQ.CreateDocumentFromFile(htmldoc); //load, parse the file
var fields = doc["input"]; //get input fields with CSS
var pairs = fields.Select(node => new Tuple<string, string>(node.Id, node.Value()))
//get values
Чтобы заставить CHM работать, вам, вероятно, нужно просмотреть свойства в проводнике Windows и снять флажок "Разблокировать содержимое".
HTML Agility Pack довольно прост, если вы знаете, как работать с Linq-to-XML или XPath.
Основы, которые вы должны знать:
//import the HtmlAgilityPack
using HtmlAgilityPack;
HtmlDocument doc = new HtmlDocument();
// Load your data
// -----------------------------
// Load doc from file:
doc.Load(pathToFile);
// OR
// Load doc from string:
doc.LoadHtml(contentsOfFile);
// -----------------------------
// Find what you're after
// -----------------------------
// Finding things using Linq
var nodes = doc.DocumentNode.DescendantsAndSelf("input")
.Where(node => !string.IsNullOrWhitespace(node.Id)
&& node.Attributes["value"] != null
&& !string.IsNullOrWhitespace(node.Attributes["value"].Value));
// OR
// Finding things using XPath
var nodes = doc.DocumentNode
.SelectNodes("//input[not(@id='') and not(@value='')]");
// -----------------------------
// looping through the nodes:
// the XPath interfaces can return null when no nodes are found
if (nodes != null)
{
foreach (var node in nodes)
{
var id = node.Id;
var value = node.Attributes["value"].Value;
}
}
Самый простой способ добавить пакет HtmlAgility Pack - использовать NuGet:
PM> Install-Package HtmlAgilityPack
Ха, похоже, идеальное время для создания бесстыдной заглушки из библиотеки, которую я написал!
Это должно быть довольно легко сделать с помощью этой библиотеки (кстати, она построена на основе пакета HtmlAgility!): https://github.com/amoerie/htmlbuilders(Вы можете найти пакет Nuget здесь: https://www.nuget.org/packages/HtmlBuilders/)
Образцы кода:
const string html = "<div class='invoice'><input type='text' name='abc' value='123'/><input id='ohgood' type='text' name='def' value='456'/></div>";
var htmlDocument = new HtmlDocument {OptionCheckSyntax = false}; // avoid exceptions when html is invalid
htmlDocument.Load(new StringReader(html));
var tag = HtmlTag.Parse(htmlDocument); // if there is a root tag
var tags = HtmlTag.ParseAll(htmlDocument); // if there is no root tag
// find looks recursively through the entire DOM tree
var inputFields = tag.Find(t => string.Equals(t.TagName, "input"));
foreach (var inputField in inputFields)
{
Console.WriteLine(inputField["type"]);
Console.WriteLine(inputField["value"]);
if(inputField.HasAttribute("id"))
Console.WriteLine(inputField["id"]);
}
Обратите внимание, что inputField[attribute] будет выдавать исключение KeyNotFoundException, если это поле не имеет указанного имени атрибута. Это потому, что HtmlTag реализует и повторно использует логику IDictionary для своих атрибутов.
Изменить: Если вы не запускаете этот код в веб-среде, вам нужно добавить ссылку на System.Web. Это потому, что эта библиотека использует класс HtmlString, который можно найти в System.Web. Просто выберите "Добавить ссылку", а затем вы можете найти его в "Сборках> Каркас"
Вы можете скачать файл CHM HtmlAgilityPack Documents здесь.
Если содержимое файла chm не видно, снимите флажок Always ask before opening this file
флажок, как показано на снимке экрана
Примечание. Приведенное выше диалоговое окно отображается для неподписанных файлов.
Источник: HtmlAgilityPack Документация