解析Html文档获取具有ID和值的所有输入字段

时间:2013-12-17 17:38:24

标签: c# html-agility-pack csquery

我有几千个(ASP.net - 凌乱的HTML)html生成的发票,我正在尝试解析并保存到数据库中。

基本上像:

 foreach(var htmlDoc in HtmlFolder)
 {
   foreach(var inputBox in htmlDoc)
   { 
      //Make Collection of ID and Values Insert to DB
   }
 }  

来自所有其他questions我已经阅读过这类问题的最佳工具是HtmlAgilityPack,但是对于我的生活,我无法获得文档.chm文件工作。关于如何使用或不使用Agility Pack实现此目的的任何想法?

提前致谢

4 个答案:

答案 0 :(得分:4)

HtmlAgilityPack的新替代方案是CsQuery。请参阅此later关于其相对性能优点的问题,但其对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

答案 1 :(得分:2)

要使CHM正常工作,您可能需要在Windows资源管理器和uncheck the "Unblock Content" checkbox中查看属性。

当您了解Linq-to-XML或XPath时,HTML Agility Pack非常简单。

您需要了解的基础知识:

//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;
    }
}

add the HtmlAgility Pack is using NuGet的最简单方法:

  

PM&GT;安装包HtmlAgilityPack

答案 2 :(得分:1)

哈,看起来是我写的一个无耻插件库的理想时间!

这个应该很容易用这个库完成(顺便说一下,它是建立在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逻辑。

编辑:如果您没有在Web环境中运行此代码,则需要添加对System.Web的引用。那是因为这个库使用了可以在System.Web中找到的HtmlString类。只需选择“添加参考”,然后您就可以在“Assemblies”下找到它。框架“

答案 3 :(得分:0)

您可以从HtmlAgilityPack下载here Documents CHM文件。

如果chm文件内容不可见,则取消选中Always ask before opening this file复选框,如屏幕截图所示

enter image description here

注意:上面的对话框显示未签名的文件

enter image description here

来源:HtmlAgilityPack Documentation