gpt4 book ai didi

c# - 在 C# 中解析 HTML 部分

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

我需要从一串 HTML 中解析部分。例如:

<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
<p>[section=quote]</p>
<p>Mauris at turpis nec dolor bibendum sollicitudin ac quis neque.</p>
<p>[/section]</p>

解析引用部分应该返回:

<p>Mauris at turpis nec dolor bibendum sollicitudin ac quis neque.</p>

目前我正在使用正则表达式来获取 [section=quote]...[/section] 中的内容,但是由于这些部分是使用所见即所得的编辑器输入的,因此部分标签本身会包含在段落标签中,所以解析结果为:

</p>
<p>Mauris at turpis nec dolor bibendum sollicitudin ac quis neque.</p>
<p>

我目前使用的正则表达式是:

\[section=(.+?)\](.+?)\[/section\]

而且我还在解析这些部分之前做了一些额外的清理工作:

protected string CleanHtml(string input) {
// remove whitespace
input = Regex.Replace(input, @"\s*(<[^>]+>)\s*", "$1", RegexOptions.Singleline);
// remove empty p elements
input = Regex.Replace(input, @"<p\s*/>|<p>\s*</p>", string.Empty);
return input;
}

任何人都可以提供一个正则表达式来实现我正在寻找的东西,或者我是在浪费时间尝试使用正则表达式来做到这一点吗?我已经看到对 Html Agility Pack 的引用 - 对于这样的事情,这会更好吗?

[更新]

感谢 Oscar,我结合使用了 HTML Agility 包和 Regex 来解析这些部分。它仍然需要一些改进,但已经快完成了。

public void ParseSections(string content)
{
this.SourceContent = content;
this.NonSectionedContent = content;

content = CleanHtml(content);

if (!sectionRegex.IsMatch(content))
return;

var doc = new HtmlDocument();
doc.LoadHtml(content);

bool flag = false;
string sectionName = string.Empty;
var sectionContent = new StringBuilder();
var unsectioned = new StringBuilder();

foreach (var n in doc.DocumentNode.SelectNodes("//p")) {
if (startSectionRegex.IsMatch(n.InnerText)) {
flag = true;
sectionName = startSectionRegex.Match(n.InnerText).Groups[1].Value.ToLowerInvariant();
continue;
}
if (endSectionRegex.IsMatch(n.InnerText)) {
flag = false;
this.Sections.Add(sectionName, sectionContent.ToString());
sectionContent.Clear();
continue;
}

if (flag)
sectionContent.Append(n.OuterHtml);
else
unsectioned.Append(n.OuterHtml);
}

this.NonSectionedContent = unsectioned.ToString();
}

最佳答案

以下作品,使用HtmlAgilityPack图书馆:

using HtmlAgilityPack;

...

HtmlDocument doc = new HtmlDocument();
doc.Load(@"C:\file.html");


bool flag = false;
var sb = new StringBuilder();
foreach (var n in doc.DocumentNode.SelectNodes("//p"))
{
switch (n.InnerText)
{
case "[section=quote]":
flag = true;
continue;
case "[/section]":
flag = false;
break;
}
if (flag)
{
sb.AppendLine(n.OuterHtml);
}
}

Console.Write(sb);
Console.ReadLine();

如果你只是想打印 Mauris at turpis nec dolor bibendum sollicitudin ac quis neque.没有<p>...</p> , 你可以替换 n.OuterHtml通过 n.InnerHtml .

当然,你应该检查是否doc.DocumentNode.SelectNodes("//p")null .
如果你想从在线源而不是文件加载 html,你可以这样做:

var htmlWeb = new HtmlWeb();  
var doc = htmlWeb.Load("http://..../page.html");

编辑:

如果[section=quote]一个[/section]可以在任何标签内(不总是 <p> ),您可以替换 doc.DocumentNode.SelectNodes("//p")通过 doc.DocumentNode.SelectNodes("//*") .

关于c# - 在 C# 中解析 HTML 部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4931760/

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