Ich habe ähnliche Fragen untersucht und online gesucht, aber ich kann keine Lösung finden. Was ich versuche, ist, alle DOM-Elemente in der richtigen Reihenfolge (usw.) auszuwählen und sie dann in eine Arraylist oder so zu platzieren.
momentan habe ich
public void Parse()
{
HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument();
// There are various options, set as needed
//htmlDoc.OptionFixNestedTags = true;
// filePath is a path to a file containing the html
htmlDoc.Load("Test.html");
// Use: htmlDoc.LoadHtml(xmlString); to load from a string (was htmlDoc.LoadXML(xmlString)
// ParseErrors is an ArrayList containing any errors from the Load statement
if (htmlDoc.ParseErrors != null && htmlDoc.ParseErrors.Count() > 0)
{
Console.WriteLine("There was an error parsing the HTML file");
}
else
{
if (htmlDoc.DocumentNode != null)
{
htmlDoc.DocumentNode.Descendants();
Console.WriteLine("document node not null");
//HtmlAgilityPack.HtmlNode bodyNode = htmlDoc.DocumentNode.SelectSingleNode("//body");
foreach (HtmlNode node in htmlDoc.DocumentNode.Descendants())
{
Console.WriteLine(node.Name);
}
}
}
}
Der Code-out setzt den Namen des Knotens (html, title, image usw.), aber er gibt die schließenden Tags als "#text" aus. Ich nehme an, das liegt daran, dass die Tags mit einem "/" beginnen. Wie kann ich alle DOM-Elemente richtig auslesen?
"#text" ist der Name von Textknoten und schließende Tags werden im DOM nicht als einzigartig dargestellt.
<div><span>foo</span> bar</div>
Wird dir Baum wie geben
div
span
#text:foo
#text:bar
Ich vermute, dass #text
Elemente, die Sie gesehen haben, Zeilenumbrüche sind, anstatt das Tag zu schließen. Zum Beispiel diese HTML-Eingabe:
<div>
<a href="http://example.org"></a>
</div>
mit Ihrem Code wird ausgegeben:
div
#text <- line break between <div> and <a>
a
#text <- line break between </a> and </div>
Sie können stattdessen diese XPath-Abfrage verwenden, um alle Elemente zu erhalten, die keine einfachen Textknoten sind (diese unnötigen Zeilenumbrüche werden übersprungen):
foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//*"))
{
Console.WriteLine(node.Name);
}
Dieser XPath bedeutet, wählen Sie alle Nachkommen des aktuellen Elements mit einem beliebigen Namen ( *
).