我正在使用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>
之前。
我可以使用正则表达式提取文本,但是更喜欢使用敏捷包,因为代码的其余部分也是如此。是否有办法使用包装?
答案 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>
之后)结果:
更新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;