假设我有以下HTML
<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>
我想在C#
中使用HTMLAgilityPack分别提取每个部分我可以轻松地获得单词和单词类
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;
但我如何获得发音或实际定义?这些落在节点之间,如果我使用defintion.InnerText
,我会在一个字符串中得到全部。有没有办法在XPath
中做到这一点?
如何在HtmlAgilityPack中的节点之间选择文本?
答案 0 :(得分:0)
有没有办法在XPath中执行此操作?
是的 - 非常简单。
您需要理解的关键概念是如何使用XML / HTML组织文本和子元素节点 - 从而组织XPath。
如果元素的文本内容被子元素打断,则它们最终会出现在单独的文本节点中。您可以按位置访问单个文本节点。
在任何元素上使用text()
只需检索所有子文本节点。将//p/text()
应用于您已显示收益的代码段(单个结果以-------
分隔):
[EMPTY TEXT NODE, EXCEPT WHITESPACE]
-----------------------
\ih-MOL-yuh-muhnt\,
-----------------------
:
The wages or perquisites arising from office, employment, or labor
此p
元素的第一个文本节点仅包含空格,因此可能不是您之后的内容。 //p/text()[2]
检索
\ih-MOL-yuh-muhnt\,
和//p/text()[3]
:
:
The wages or perquisites arising from office, employment, or labor
答案 1 :(得分:0)
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());
}
输出结果为:
如果您想要2. \ih-MOL-yuh-muhnt\,
结果。你需要这个。
HtmlNode a = text.SelectNodes(".//text()[2]").FirstOrDefault();