【问题标题】:Get tags around text in HTML document using C#使用 C# 在 HTML 文档中获取文本周围的标签
【发布时间】:2012-04-04 19:44:29
【问题描述】:

我想在 HTML 文件中搜索某个字符串,然后提取标签。给定:

<div_outer><div_inner>Happy birthday<div><div>

我想在 HTML 中搜索“生日快乐”,然后有一个函数返回某种标签结构:这是最里面的标签,这是那个标签之外的标签,等等。所以,<div_inner></div> 然后@987654323 @。

有什么想法吗?我正在考虑 HTMLAgilityPack,但我无法弄清楚如何去做。

一如既往地感谢各位。

【问题讨论】:

  • 这个 HTML 的来源是什么?

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


【解决方案1】:

HAP 确实是一个很好的地方。

您可以使用NodeOuterHtmlParent 属性来获取封闭元素和标记。

【讨论】:

  • 那么你是说遍历每个标签直到我找到文本然后向后工作?好主意,但听起来效率不高。我想有时显而易见的答案会获胜,哈哈。
  • @MarkWilliams - 如果您没有任何方法可以导航到文本(例如具有特定属性值的 div),那么这是使用解析器进行此操作的唯一方法。您可以获取字符串的索引,然后在字符串中向后向前查找以查找封闭元素,但这意味着您要编写自己的解析例程。
【解决方案2】:

您可以为此使用 xpath。我使用//*[text()='Happy birthday'][1]/ancestor-or-self::* 表达式查找文本内容为Happy birthday 的第一个(为简单起见)节点,然后返回该节点的所有祖先(父、祖父等)和节点本身:

var doc = new HtmlDocument();
doc.LoadHtml("<div_outer><div_inner>Happy birthday<div><div>");

var ancestors = doc.DocumentNode
    .SelectNodes("//*[text()='Happy birthday'][1]/ancestor-or-self::*")
    .Reverse()
    .ToList();

好像返回的节点的顺序就是文档中找到的节点的顺序,所以我用Enumerable.Reverse的方法倒过来了。

这将返回 2 个节点:div_innerdiv_outer

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-22
    • 1970-01-01
    • 2011-04-07
    • 1970-01-01
    • 2021-08-08
    • 1970-01-01
    • 2017-04-02
    • 1970-01-01
    相关资源
    最近更新 更多