【问题标题】:Getting text from between two html nodes using HtmlAgilityPack使用 HtmlAgilityPack 从两个 html 节点之间获取文本
【发布时间】:2015-01-30 15:01:36
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    有没有办法在 XPath 中做到这一点?

    是的,而且非常简单。

    您需要了解的关键概念是文本和子元素节点如何在 XML/HTML 中组织 - 以及 XPath。

    如果元素的文本内容被子元素标点,它们最终会出现在单独的文本节点中。您可以按位置访问单个文本节点。

    只需在任何元素上使用text() 即可检索所有子文本节点。将//p/text() 应用于您已显示产量的sn-p(由------- 分隔的各个结果):

    [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
    

    【讨论】:

      【解决方案2】:
              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-yuh-muhnt\,
      3. 名词
      4. :
      5. 因职务、就业或劳动而产生的工资或津贴

      如果你想要2. \ih-MOL-yuh-muhnt\, 结果。你需要这个。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-18
        • 1970-01-01
        • 2011-11-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多