C# 用c语言解析HTML的各个部分#

C# 用c语言解析HTML的各个部分#,c#,regex,html-parsing,html-agility-pack,C#,Regex,Html Parsing,Html Agility Pack,我需要从一个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> 在分

我需要从一个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>
在分析这些部分之前,我还做了一些额外的清理工作:

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;
}
换一个怎么样

<p>[section=quote]</p>


作为清理工作的一部分。然后您可以使用现有的正则表达式。

使用
HtmlAgilityPack
库执行以下工作:

using HtmlAgilityPack;

如果你只想打印
turpis nec dolor bibendum sollicitudin ac quis neque的莫里斯。
如果没有

,您可以用
n.InnerHtml
替换
n.OuterHtml

当然,您应该检查
doc.DocumentNode.SelectNodes(“//p”)
是否为
null

如果要从联机源而不是文件加载html,可以执行以下操作:

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


如果
[section=quote]
一个
[/section]
可以在任何标记中(并不总是
),你可以用
doc.DocumentNode.SelectNodes(“//*”)替换
doc.DocumentNode.SelectNodes(“//*”)

用正则表达式解析html的强制性链接通常是个坏主意,因为html不是规则的。如果你能看一看html解析器,它们有很多可用的,而且它们会带来更少的痛苦。因为html内容完全掌握在用户手中,我实际上不知道[section]标记将包装在什么里面(可以是div、p,任何东西)。哇,谢谢。我只是注意到你的回答。让我来试一试!
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();
}
<p>[section=quote]</p>
[section=quote]
<p>[/section]</p>
[/section]
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();
var htmlWeb = new HtmlWeb();  
var doc = htmlWeb.Load("http://..../page.html");