代码之家  ›  专栏  ›  技术社区  ›  Doctor Jones

C是否有linq-to-html,或者其他一些很好的.NET HTML操作API?

  •  20
  • Doctor Jones  · 技术社区  · 17 年前

    我有一个C WPF应用程序,需要使用在网页上作为HTML表公开的数据。

    After getting inspiration from this url 我尝试使用linq-to-xml来解析HTML文档,但这仅在HTML文档的格式非常好(并且其中没有任何注释或HTML实体)的情况下才有效。我已经设法用这种技术得到了一个有效的解决方案,但它远不是理想的。

    我正在寻找一个解析HTML的解决方案。我以前已经破解过“解决方案”,但它们很脆弱。我正在寻找一种解析/操作文档的强大方法。理想情况下,我想要一些能够使任务像JavaScript/jQuery那样简单的东西。

    有人知道一个很好的.NET库或用于解析/操作HTML的实用程序吗?

    5 回复  |  直到 14 年前
        1
  •  12
  •   Doctor Jones    16 年前

    尽管它不是基于LINQ的, 我建议研究 HTML Agility Pack 来自CODULTEX。

    注意:HTML敏捷性包现在支持LINQ到对象(通过类似LINQ到XML的接口)

    从HTML敏捷性包页面:

    这是一个敏捷的HTML解析器,它构建了一个读/写DOM,并支持普通的xpath或xslt(您实际上不需要理解xpath或xslt就可以使用它,不用担心…)。它是一个.NET代码库,允许您解析“离开Web”的HTML文件。解析器对“真实世界”格式错误的HTML非常宽容。对象模型与System.xml的建议非常相似,但对于HTML文档(或流)。

        2
  •  5
  •   Community Mohan Dere    14 年前
        3
  •  2
  •   Dave Swersky    17 年前

    HTML的格式很少好到可以可靠地使用LINQ to XML。它是 可以想象的 您可能会发现一个HTML“清理器”,它可以很好地修复格式以供阅读,但并不能说明它有多强大。

    我假设这是一个“screensraper”,它从一个您无法控制的HTML表中读取。在这种情况下,不要过分强调健壮性,屏幕抓取本身就是脆弱的。如果您的需求是一成不变的,那么如果/当您正在擦除的HTML发生变化时,请设计一个易于更新的scraper。

        4
  •  2
  •   AndyM    17 年前

    我在最近的一个项目中不得不这样做,并且使用了LinqToXML。如果您知道XHTML总是干净的,那么您可以非常容易地递归地复制DOM,但是我使用了devcomponents htmldocument类库( http://www.devcomponents.com/htmldoc/ )将HTML转换为XML,然后将其转换为Xelement。这减少了将HTML放入Xelement层次结构的挑战。一个警告是它会扼杀脚本元素,所以我用暴力删除了那些元素。

        /// <summary>
        /// Extracts an HtmlDocument DOM to an XElement DOM that can be queried using LINQ to XML.
        /// </summary>
        /// <param name="htmlDocument">HtmlDocument containing DOM of page to extract.</param>
        /// <returns>HTML content as <see cref="XElement" /> for consumption by LINQ to XML.</returns>
        public XElement ExtractXml(HtmlDocument htmlDocument) {
            XmlDocument xmlDoc = htmlDocument.ToXMLDocument();
    
            // Find and remove all script tags from XML DOM or LINQ to XML will choke on XElement.Parse(XmlDocument).
            IList<XmlNode> nodes = new List<XmlNode>();
            foreach (XmlNode node in xmlDoc.GetElementsByTagName("script"))
                nodes.Add(node);
            foreach (XmlNode node in nodes)
                node.ParentNode.RemoveChild(node);
    
            return XElement.Parse(xmlDoc.OuterXml);
        }
    
        5
  •  0
  •   Community Mohan Dere    9 年前

    我在这里发布了一些提供“linq to html”功能的代码:

    Looking for C# HTML parser

    推荐文章