【问题标题】:How to identify html tags in html string如何识别html字符串中的html标签
【发布时间】:2021-03-17 15:19:54
【问题描述】:

我有以下 html 字符串,我正在尝试使用以下代码识别 html 字符串中整个文本的 <br> 标记开始和结束

 var htmlstring = "<p><span><br> text <b>text &nbsp;<br></b>text <br></span></p>"
 var document = new HtmlDocument();
 document.LoadHtml(htmlString);
           
 var nodes= rootNode.SelectNodes("//br")

但它提供了所有&lt;br&gt;标签节点,我只希望在html字符串下方的整个html文本字符串的开头和结尾处

<p><span><br> text <b> text&nbsp;<br></b>text <br></span></p>

我正在寻找的节点应该是 2 而不是 3,但因为它计算了文本之间出现的 &lt;br&gt; 标记,所以得到了 3。

谁能帮我解决这个问题,非常感谢提前

【问题讨论】:

  • 为什么不直接使用 linq:document.DocumentNode.SelectNodes("//br").First()
  • 你应该有一个文本节点的定义,什么是文本节点?例如

    标签被视为文本节点

  • @FlatEric 这也将给出这个计数&lt;p&gt;&lt;span&gt; text &lt;b&gt;text &amp;nbsp;&lt;br&gt;&lt;/b&gt;text&lt;/span&gt;&lt;/p&gt; 我不想要那个我只想在整个 html 字符串的开头和结尾识别标签,基本上是想稍后删除标签
  • @AshkanMobayenKhiabani 我只想在我正在寻找的整个 html 字符串的开头或结尾选择标签&lt;br&gt;,但上面的代码给出了所有标签跨度>
  • 我不知道为什么First 应该给你除了第一个...

标签: c# html html-agility-pack


【解决方案1】:

您可以使用Split 方法来解决您的问题。我给你一个建议如下。它在&lt;br&gt; 标签之间打印文本,这些标签是开始标签和结束标签。此外,您可以根据自己的要求修改输出。也许可以通过使用 regex 模式来解决。

const string tag = "<br>";
var splitedHtmlString = htmlString.Split(tag);
StringBuilder builder = new StringBuilder();
for (int i = 1; i < splitedHtmlString.Length - 1; i++)
{
     builder.Append(splitedHtmlString[i]);
     builder.Append(tag);
}
builder.Remove(builder.ToString().Length - tag.Length, tag.Length);
Console.WriteLine(builder.ToString());

输出:text &lt;b&gt;text &amp;nbsp;&lt;br&gt;&lt;/b&gt;text

【讨论】:

  • 很抱歉,它在开头和结尾都删除了&lt;p&gt; 标签,并在此&lt;p&gt;&lt;span&gt;&lt;/span&gt; text &lt;b&gt;&amp;nbsp;&lt;br&gt;&lt;/b&gt;text &lt;/span&gt;&lt;/p&gt; 中收到错误,错误为StartIndex cannot be less than zero. (Parameter 'startIndex')
  • @EnigmaState 你可以从第零个索引开始for循环,这样你就可以得到

    标签。

  • 对于这个输入&lt;p&gt;&lt;span&gt; text &lt;b&gt;&amp;nbsp;&lt;br&gt;&lt;/b&gt;text &lt;/span&gt;&lt;/p&gt; 得到输出为&lt;p&gt;&lt;span&gt; text &lt;b&gt;&amp;nbsp; 而不是&lt;p&gt;&lt;span&gt; text &lt;b&gt;&amp;nbsp;&lt;br&gt;&lt;/b&gt;text &lt;/span&gt;&lt;/p&gt;
  • @EnigmaState 嗯好的,只需编写 for 循环,如:for (int i = 0; i &lt; splitedHtmlString.Length ; i++)
  • 很抱歉再次打扰您,在这种情况下&lt;p&gt;&lt;span&gt;&lt;br&gt; text &lt;b&gt;&amp;nbsp;&lt;br&gt;&lt;/b&gt;text &lt;br&gt;&lt;/span&gt;&lt;/p&gt; 没有删除开始和结束标签,输出与输入相同,正在寻找这种输出&lt;p&gt;&lt;span&gt;text &lt;b&gt;&amp;nbsp;&lt;br&gt;&lt;/b&gt;text &lt;/span&gt;&lt;/p&gt;
【解决方案2】:

您可以使用 HtmlAgilityPack 库将字符串转换为 HtmlDocument 并按节点过滤

HtmlDocument 文档 = 新 HtmlDocument();

document.LoadHtml("你的html代码");

var htmlTag = document.DocumentNode.SelectNodes("//br");

【讨论】:

    猜你喜欢
    • 2015-01-18
    • 2017-03-29
    • 2012-10-01
    • 1970-01-01
    • 2020-02-23
    • 2021-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多