C#是否有LINQ to HTML或其他一些好的.Net HTML操作API?
我有一个C#WPF应用程序,它需要使用在网页上作为HTML表公开的数据 我尝试使用LINQtoXML解析Html文档,但这仅在Html文档格式非常好(并且没有任何注释或Html实体)的情况下才有效。我已经设法用这种技术得到了一个有效的解决方案,但它离理想还很远 我正在寻找一个用于解析HTML的解决方案。我以前曾破解过“解决方案”,但它们很脆弱。我正在寻找一种强大的解析/操作文档的方法。理想情况下,我希望能够像Javascript/JQuery一样轻松地完成任务C#是否有LINQ to HTML或其他一些好的.Net HTML操作API?,c#,.net,linq,C#,.net,Linq,我有一个C#WPF应用程序,它需要使用在网页上作为HTML表公开的数据 我尝试使用LINQtoXML解析Html文档,但这仅在Html文档格式非常好(并且没有任何注释或Html实体)的情况下才有效。我已经设法用这种技术得到了一个有效的解决方案,但它离理想还很远 我正在寻找一个用于解析HTML的解决方案。我以前曾破解过“解决方案”,但它们很脆弱。我正在寻找一种强大的解析/操作文档的方法。理想情况下,我希望能够像Javascript/JQuery一样轻松地完成任务 有谁知道一个好的.Net库或实用程
有谁知道一个好的.Net库或实用程序可以解析/操作HTML吗?HTML的格式很少好到可以可靠地使用LINQ to XML。可以想象,您可能会发现一个HTML“清理器”,它可以很好地修复格式以供阅读,但目前还不知道它会有多强大
我假设这是一个“screenscraper”,它从一个您无法控制的HTML表中读取。在这种情况下,不要过分强调坚固性,刮网本身就是脆弱的。如果您的需求是一成不变的,那么设计刮板,使其在您正在刮取的HTML发生更改时能够轻松更新。我在最近的一个项目中不得不这样做,并且我使用了LINQ to XML。如果您知道它总是干净的XHTML,那么您可能很容易递归地复制DOM,但是我使用DevComponents HTMLDocument类库()将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);
}
//
///将HtmlDocument DOM提取到可以使用LINQ to XML查询的XElement DOM。
///
///包含要提取的页面的DOM的HtmlDocument。
///供LINQ转换为XML使用的HTML内容。
公共XElement提取XML(HtmlDocument HtmlDocument){
XmlDocument xmlDoc=htmlDocument.ToXMLDocument();
//在XElement.Parse(XmlDocument)上查找并删除XMLDOM或LINQ到XML的所有脚本标记。
IList节点=新列表();
foreach(xmlDoc.GetElementsByTagName(“脚本”)中的XmlNode节点)
nodes.Add(node);
foreach(节点中的XmlNode节点)
node.ParentNode.RemoveChild(节点);
返回XElement.Parse(xmlDoc.OuterXml);
}
尽管它不是基于LINQ的,但我建议研究CodePlex中的
注意:Html Agility Pack现在支持Linq到对象(通过类似Linq到Xml的接口)
从HTML Agility Pack页面:
这是一个敏捷的HTML解析器,它构建读/写DOM并支持纯XPATH或XSLT(您实际上不必理解XPATH或XSLT就可以使用它,不用担心……)。它是一个.NET代码库,允许您解析“web外”HTML文件。解析器对“真实世界”格式错误的HTML非常宽容。对象模型与System.Xml非常相似,但适用于HTML文档(或流)
我在这里发布了一些提供“LINQ到HTML”功能的代码:
这里有一个LINQ到HTML库:
您是如何获得html的?通过webbrowser控件,或通过HttpRequest,或…?嗨,我通过HttpRequest获得HTML。你成功使用过这个产品吗?复杂的许可证意味着什么?是的,我使用这个库已有几年了,效果很好。我强烈推荐给任何人。它还包含一个Nuget包,非常有用。