节点内部文本和第一个子节点文本的文本

text of node's inner text and first child nodes text

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

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

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

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

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

访问 <a>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