使用HtmlAgilityPack从两个html节点之间获取文本

时间:2015-01-30 15:01:37

标签: c# linq xpath html-agility-pack nodes

假设我有以下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中的节点之间选择文本?

2 个答案:

答案 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());
        }

输出结果为:

  1. 酬金
  2. \ IH-MOL-裕-muhnt \,
  3. 名词
  4. 办公,就业或劳动产生的工资或津贴
  5. 如果您想要2. \ih-MOL-yuh-muhnt\,结果。你需要这个。

    HtmlNode a = text.SelectNodes(".//text()[2]").FirstOrDefault();