【问题标题】:text of node's inner text and first child nodes text节点内部文本和第一个子节点文本的文本
【发布时间】:2015-06-25 14:33:08
【问题描述】:

我在这样的结构页面中有多个链接:

<a ....>
    <b>Text I Need</b>
    Also Text I need
</a>

我想从上面的代码中提取字符串,例如“Text I NeedAlso Text I need” 我成功提取了第二部分,但我不确定如何在 b 标签中选择文本,目前我正在使用这个:

var link_list = doc.DocumentNode.SelectNodes(@"/a/text()");
foreach (var link in link_list)
{
   Console.WriteLine(link.InnerText);
}

我应该不是获取文本而是获取 a 的 html,然后使用正则表达式删除标签并提取文本,还是有其他方法?

【问题讨论】:

  • 这似乎对我有用。见jsfiddle.net/hmhm5hzb
  • 很奇怪,因为对我来说它只是给出不在 b 标签中的部分,但是从 xpath 中删除 '/text()' 解决了它

标签: c# html-agility-pack


【解决方案1】:

访问&lt;a&gt; 的InnerText 属性应该会立即为您提供所有文本节点:

var html = @"<a ....>
    <b>Text I Need</b>
    Also Text I need
</a>";
var doc = new HtmlDocument();
doc.LoadHtml(html);
var link_list = doc.DocumentNode.SelectNodes("/a");
foreach (var link in link_list)
{
    Console.WriteLine(link.InnerText);
}

或者如果您真的只需要获取直接子文本节点和大子文本节点,请尝试以下方式:

var link_list = doc.DocumentNode.SelectNodes("/a");
foreach (var link in link_list)
{
    var texts = link.SelectNodes("text() | */text()");
    Console.WriteLine(String.Join("", texts.Select(o => o.InnerText)));
}

输出:

Text I Need
Also Text I need

【讨论】:

  • 刚刚意识到我的错误是将 '/text()' 放入 Xpath,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多