Frage Erhalte einen Wert eines Attributs mit XPath und HtmlAgilityPack


Ich habe ein HTML-Dokument und parse es mit XPath. Ich möchte einen Wert der Elementeingabe erhalten, aber es hat nicht funktioniert.

Mein Html:

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

Mein Code:

using HtmlAgilityPack;

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

Damit Ich möchte den Wert erhalten: "10743" (Und es macht mir nichts aus, mit der Antwort noch ein anderes Etikett zu bekommen.)


9
2017-12-29 10:47


Ursprung


Antworten:


Sie können es bekommen .Attributes Sammlung:

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

14
2017-12-29 17:36



Sie können das Attribut auch direkt abrufen, wenn Sie die Option verwenden 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;

6
2018-03-14 17:06



Update2: Hier ist ein Codebeispiel, wie man Werte von Attributen mit Html Agility Pack erhält:

http://htmlagilypack.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");

Sie müssen diesen Code natürlich an Ihre Bedürfnisse anpassen - zum Beispiel werden Sie die Attribute nicht ändern, sondern nur verwenden att.Value .


Aktualisieren: Sie können sich auch diese Frage ansehen:

Auswählen von Attributwerten mit html Agility Pack


Ihr Problem ist höchstwahrscheinlich ein Standard-Namespace-Problem - Suchen Sie nach "XPath default namespace c #" und Sie werden viele gute Lösungen finden (Hinweis: Verwenden Sie die Überladung von SelectNodes() das hat ein XmlNamespaceManager Streit).

Der folgende Code zeigt, was man für ein Attribut in einem Dokument erhält "kein Namensraum":

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);

    }
}

Das Ergebnis dieser App ist:

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

Jetzt für ein Dokument, das sich in einem Standardnamespace befindet:

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);

    }
}

Das Ausführen dieser App erzeugt wieder die gewünschten Ergebnisse:

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

6
2017-12-29 13:29