通过XPath和HtmlAgilityPack获取属性的值

我有一个HTML文档,我用XPath解析它。 我想获得元素输入的值,但它不起作用。

我的Html:

       

我的代码:

 using HtmlAgilityPack; HtmlAgilityPack.HtmlDocument doc; HtmlWeb hw = new HtmlWeb(); HtmlNodeCollection node = doc.DocumentNode.SelectNodes("//input/@value"); string s=node[0].InnerText; 

所以我想得到这个值:“10743” (我不介意另外给出答案的标签。)

你可以得到它.Attributes集合:

 var doc = new HtmlAgilityPack.HtmlDocument(); doc.Load("file.html"); var node = doc.DocumentNode.SelectNodes("//input") [0]; var val = node.Attributes["value"].Value; //10743 

如果使用HtmlNavigator也可以直接获取属性。

 //Load document from some html string HtmlDocument hdoc = new HtmlDocument(); hdoc.LoadHtml(htmlContent); //load navigator for current document HtmlNavigator navigator = (HtmlNodeNavigator)hdoc.CreateNavigator(); //Get value with given xpath string xpath = "//input/@value"; string val = navigator.SelectSingleNode(xpath).Value; 

Update2 :这是一个如何使用Html Agility Pack获取属性值的代码示例:

http://htmlagilitypack.codeplex.com/wikipage?title=Examples

  HtmlDocument doc = new HtmlDocument(); doc.Load("file.htm"); foreach(HtmlNode link in doc.DocumentElement.SelectNodes("//a[@href"]) { HtmlAttribute att = link.Attributes["href"]; att.Value = FixLink(att); } doc.Save("file.htm"); 

您显然需要根据需要调整此代码 – 例如,您不会修改属性,而只会使用att.Value


更新 :你也可以看看这个问题:

使用html Agility Pack选择属性值


您的问题很可能是默认命名空间问题 – 搜索“XPath默认命名空间c#”,您会发现许多好的解决方案(提示:使用具有XmlNamespaceManager参数的SelectNodes()重载)。

以下代码显示了在 “无命名空间”中文档中的属性获取的内容

 using System; using System.IO; using System.Xml; public class Sample { public static void Main() { XmlDocument doc = new XmlDocument(); doc.LoadXml("" + "Pride And Prejudice" + ""); XmlNode root = doc.DocumentElement; XmlNode value = doc.SelectNodes("//input/@value")[0]; Console.WriteLine("Inner text: " + value.InnerText); Console.WriteLine("InnerXml: " + value.InnerXml); Console.WriteLine("OuterXml: " + value.OuterXml); Console.WriteLine("Value: " + value.Value); } } 

运行此应用程序的结果是

 Inner text: novel InnerXml: novel OuterXml: value="novel" Value: novel 

现在,对于默认命名空间中的文档

 using System; using System.IO; using System.Xml; public class Sample { public static void Main() { XmlDocument doc = new XmlDocument(); doc.LoadXml("" + "Pride And Prejudice" + ""); XmlNode root = doc.DocumentElement; XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable); nsmgr.AddNamespace("x", "some:Namespace"); XmlNode value = doc.SelectNodes("//x:input/@value", nsmgr)[0]; Console.WriteLine("Inner text: " + value.InnerText); Console.WriteLine("InnerXml: " + value.InnerXml); Console.WriteLine("OuterXml: " + value.OuterXml); Console.WriteLine("Value: " + value.Value); } } 

运行此应用程序再次产生想要的结果

 Inner text: novel InnerXml: novel OuterXml: value="novel" Value: novel