通过XPath和htmllagilitypack获取属性的值

本文关键字:属性 获取 htmllagilitypack XPath 通过 | 更新日期: 2023-09-27 18:19:05

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

我的Html:

<tbody>
  <tr>
    <td>
      <input type="text" name="item" value="10743" readonly="readonly" size="10"/>
    </td>
  </tr>
</tbody>
我代码:

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

所以我想得到的值:"10743"(我不介意得到另一个标签的答案。)

通过XPath和htmllagilitypack获取属性的值

您可以在.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敏捷包获取属性值的代码示例:

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#",您将找到许多很好的解决方案(提示:使用重载 SelectNodes() 具有 XmlNamespaceManager 参数)。

下面的代码显示了在 "no namespace"中文档中的属性得到的结果:

using System;
using System.IO;
using System.Xml;
public class Sample
{
    public static void Main()
    {
        XmlDocument doc = new XmlDocument();
        doc.LoadXml("<input value='novel' ISBN='1-861001-57-5'>" +
                    "<title>Pride And Prejudice</title>" +
                    "</input>");
        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("<input xmlns='some:Namespace' value='novel' ISBN='1-861001-57-5'>" +
                    "<title>Pride And Prejudice</title>" +
                    "</input>");
        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