gpt4 book ai didi

c# - 当没有关闭的 html 标签时,是否可以解决 HtmlAgilityPack 中的问题?

转载 作者:行者123 更新时间:2023-11-30 21:23:11 25 4
gpt4 key购买 nike

好吧,我有以下问题。
我的 html 格式不正确,在这种情况下,我无法使用 html 敏捷包选择节点。
代码如下:

string strHtml = @"
<html>
<div>
<p><strong>Elem_A</strong>String_A1_2 String_A1_2</p>
<p><strong>Elem_B</strong>String_B1_2 String_B1_2</p>
</div>
<div>
<p><strong>Elem_A</strong>String_A2_2 <String_A2_2> asdas</p>
<p><strong>Elem_B</strong>String_B2_2 String_B2_2</p>
</div>
</html>";
HtmlAgilityPack.HtmlDocument objHtmlDocument = new HtmlAgilityPack.HtmlDocument();
objHtmlDocument.LoadHtml(strHtml);
HtmlAgilityPack.HtmlNodeCollection colnodePs = objHtmlDocument.DocumentNode.SelectNodes("//p");
List<string> lststrText = new List<string>();
foreach (HtmlAgilityPack.HtmlNode nodeP in colnodePs)
{
lststrText.Add(nodeP.InnerHtml);
}

问题是 String_A2_2 被括在括号中。
所以 htmlagility pack 在 lststrText 中返回 5 个字符串而不是 4 个。
那么是否可以让 htmlagility pack 返回元素 3 作为 "<strong>Elem_A</strong>String_A2_2 <String_A2_2> asdas" ?
或者我可以做一些预处理来关闭元素?
lststrText的当前内容是

lststrText[0] = "<strong>Elem_A</strong>String_A1_2 String_A1_2"  
lststrText[1] = "<strong>Elem_B</strong>String_B1_2 String_B1_2"
lststrText[2] = ""
lststrText[3] = ""
lststrText[4] = "<strong>Elem_B</strong>String_B2_2 String_B2_2"

最佳答案

大多数 html 解析器都试图构建一个有效的 DOM,这意味着不接受悬挂标签。它们将以某种方式转换或关闭。

如果只选择节点对你很重要,速度和大量数据不是问题,你可以用正则表达式获取所有

标签:

Regex reMatchP = new Regex(@"<(p)>.*?</\1>");
foreach (Match m in reMatchP.Matches(strHtml))
{
Console.WriteLine(m.Value);
}

此正则表达式假设

标签格式正确且闭合。

如果你要在你的程序中经常运行这个正则表达式,你应该将它声明为:

static Regex reMatchP = new Regex(@"<(p)>.*?</\1>", RegexOptions.Compiled);

[编辑:敏捷包更改]

如果您想使用 HtmlAgility 包,您可以修改 HtmlDocument.cs 中的 PushNodeEnd 函数:

if (HtmlNode.IsCDataElement(CurrentNodeName()))
{
_state = ParseState.PcData;
return true;
}

// new code start
if ( !AllowedTags.Contains(_currentnode.Name) )
{
close = true;
}
// new code end

其中 AllowedTags 是所有已知标签的列表:b、p、br、span、div 等。

输出不是您想要的 100%,但可能足够接近?

<strong>Elem_A</strong>String_A1_2 String_A1_2
<strong>Elem_B</strong>String_B1_2 String_B1_2
<strong>Elem_A</strong>String_A2_2 <ignorestring_a2_2></ignorestring_a2_2> asdas
<strong>Elem_B</strong>String_B2_2 String_B2_2

关于c# - 当没有关闭的 html 标签时,是否可以解决 HtmlAgilityPack 中的问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1928293/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com