获取没有class或id的模式之后的文本

时间:2014-03-20 10:34:01

标签: c# regex parsing html-agility-pack

我正在使用HtmlAgiityPack

这是一个很好的解析数据的工具,但是我使用它的每一个实例,我总是有一个类或id来瞄准,即 -

string example = doc.DocumentNode.SelectSingleNode("//div[@class='target']").InnerText.Trim();

但是我遇到了一段没有嵌套在任何特定模式中的文本,其中包含我可以瞄准的类或ID。例如。 -

<p>Example Header</p>: This is the text I want!<br>

然而,给出的示例始终遵循相同的模式,即文本将始终位于</p>:之后和<br>之前。

我可以使用正则表达式提取文本,但是更喜欢使用敏捷包,因为代码的其余部分也是如此。是否有办法使用包装?

1 个答案:

答案 0 :(得分:1)

这个XPath对我有用:

var html = @"<div class=""target"">
<p>Example Header</p>: This is the text I want!<br>
</div>";
var doc = new HtmlDocument();

doc.LoadHtml(html);
var result = doc.DocumentNode.SelectSingleNode("/div[@class='target']/text()[(normalize-space())]").OuterHtml;
Console.WriteLine(result);
  • /text()选择<div>
  • 的直接子节点的所有文本节点
  • [(normalize-space())]排除仅包含白色的所有文本节点 空格(此html示例中排除了2个新行:一个在<p>之前,另一个在<br>之后)

结果: enter image description here

更新I:

所有元素都必须有父元素,例如上面示例中的<div>。或者,如果它是您正在谈论的根节点,那么相同的方法仍然有效。关键是使用/text() XPath来获取文本节点:

var html = @"<p>Example Header</p>: This is the text I want!<br>";
var doc = new HtmlDocument();
doc.LoadHtml(html);
var result = doc.DocumentNode.SelectSingleNode("/text()[(normalize-space())]").OuterHtml;
Console.WriteLine(result);

更新II:

好的,所以你想在<p>元素之后和<br>元素之前选择文本节点。您可以使用此XPath:

var result = 
        doc.DocumentNode
           .SelectSingleNode("/text()[following-sibling::br and preceding-sibling::p]")
           .OuterHtml;