使用 HtmlAgilityPack 拆分 HTML 字符串

Splitting HTML string with HtmlAgilityPack

我有这样的 html 代码:

<div class="classA">
Content
</div>
<div class="classA">
Content
</div>
 // another ClassA ....

 <div class="classA">
 <blockquote>Some key</blockquote >
 </div>

如何删除 Some key 的 outerHTML 或获取 class 以上的所有 html 代码,其中 Some key 带有 Html 敏捷包?

意思是,我要的结果是

 <div class="classA">
Content
</div>
<div class="classA">
Content
</div>
 // another ClassA ....

看起来你想找到文本 Some key,然后查看父元素,直到找到带有 class classA 的元素,然后删除该元素 > 在 DOM.

你可以通过它的内部文本找到一个元素:https://html-agility-pack.net/knowledge-base/14288183/find-the-parent-div-of-a-specific-text-in-a-htmldocument

然后你可能想要循环父直到 null 或者你找到一个 ParentNode.HasClass('classA')。您还可以在 Ancestors() 上使用 Linq。

此时,您已拥有要删除的元素。因此,您可以使用它来查找自己之后的兄弟姐妹并将其删除。

XPATH 是你的朋友。

这个 returns 预期结果只需要一个查询

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(html);
foreach (HtmlNode node in doc.DocumentNode.SelectNodes(
   "//blockquote[text()='Some key']/parent::*/preceding::*"))
      Console.WriteLine(node.OuterHtml);

其中

  • //blockquote[text()='Some key'] 选择具有所需键的元素。如果它应该在 <div class="classA"> 之内,请使用 //div[@class='classA']/blockquote[text()='Some key']
  • 的更精确的路径表达式
  • parent选择父元素,即<div class="classA">
  • preceding 选择给定节点之前的所有节点

演示:https://dotnetfiddle.net/BlQ3w9