Angenommen, ich habe den folgenden HTML-Code
<p id="definition">
<span class="hw">emolument</span> \ih-MOL-yuh-muhnt\, <i>noun</i>:
The wages or perquisites arising from office, employment, or labor
</p>
Ich möchte jeden Teil separat mit HTMLAgilityPack in C # extrahieren
Ich kann die Wort- und Wortklasse leicht genug bekommen
var definition = doc.DocumentNode.Descendants()
.Where(x => x.Name == "p" && x.Attributes["id"] == "definition")
.FirstOrDefault();
string word = definition.Descendants()
.Where(x => x.Name == "span")
.FirstOrDefault().InnerText;
string word_class = definition.Descendants()
.Where(x => x.Name == "i")
.FirstOrDefault().InnerText;
Aber wie bekomme ich die Aussprache oder tatsächliche Definition? Diese fallen zwischen Knoten, und wenn ich defintion.InnerText
benutze defintion.InnerText
ich die ganze Menge in einer Zeichenfolge. Gibt es eine Möglichkeit, dies in XPath
zu tun?
Wie wähle ich Text zwischen Knoten in HtmlAgilityPack?
Gibt es eine Möglichkeit, dies in XPath zu tun?
Ja - und ziemlich einfach.
Das Schlüsselkonzept, das Sie verstehen müssen, ist, wie Text- und Kindelementknoten in XML / HTML organisiert sind - und somit XPath.
Wenn der Textinhalt eines Elements von untergeordneten Elementen unterbrochen wird, enden sie in separaten Textknoten. Sie können auf einzelne Textknoten anhand ihrer Position zugreifen.
Wenn Sie einfach text()
für ein beliebiges Element verwenden, werden alle untergeordneten Textknoten abgerufen. Anwenden von //p/text()
auf das Snippet, das Sie angezeigt haben, ergibt (individuelle Ergebnisse getrennt durch -------
):
[EMPTY TEXT NODE, EXCEPT WHITESPACE]
-----------------------
\ih-MOL-yuh-muhnt\,
-----------------------
:
The wages or perquisites arising from office, employment, or labor
Der erste Textknoten dieses p
Elements enthält nur Leerzeichen. Das ist wahrscheinlich nicht das, wonach Sie suchen. //p/text()[2]
ruft ab
\ih-MOL-yuh-muhnt\,
und //p/text()[3]
:
:
The wages or perquisites arising from office, employment, or labor
HtmlNode text = doc.DocumentNode.Descendants().Where(x => x.Name == "p" && x.Id == "definition").FirstOrDefault();
foreach (HtmlNode node in text.SelectNodes(".//text()"))
{
Console.WriteLine(node.InnerText.Trim());
}
Ausgabe davon wird sein:
Wenn Sie wollen 2. \ih-MOL-yuh-muhnt\,
Ergebnis. Du brauchst das.
HtmlNode a = text.SelectNodes(".//text()[2]").FirstOrDefault();