代码之家  ›  专栏  ›  技术社区  ›  Andreas Niedermair

如何解析这段HTML?

  •  3
  • Andreas Niedermair  · 技术社区  · 14 年前

    早上好! 我正在使用C(框架3.5sp1)并希望通过regex解析以下HTML片段:

    <h1>My caption</h1>
    <p>Here will be some text</p>
    
    <hr class="cs" />
    <h2 id="x">CaptionX</h2>
    <p>Some text</p>
    
    <hr class="cs" />
    <h2 id="x">CaptionX</h2>
    <p>Some text</p>
    
    <hr class="cs" />
    <h2 id="x">CaptionX</h2>
    <p>Some text</p>
    

    我需要以下输出:

    • 第1组:h1含量
    • 第2组:正文后的h1内容
    • 第3-N组:子标题内容+文本

    我有什么自动取款机:

    <hr.*?/>
    <h2.*?>(.*?)</h2>
    ([\W\S]*?)
    <hr.*?/>
    

    这将给我每个奇怪的子标题+内容(如1,3,…)由于尾随 <hr/> . 对于分析h1标题,我有另一个模式( <h1.*?>(.*?)</h1> ,这只给了我标题,但没有内容-我可以用ATM机。

    是否有人为我提供提示/解决方案或任何其他逻辑(例如,通过读卡器解析HTML并以这种方式分配它?)?

    编辑:
    一些人带来的 HTMLAgilityPack 我对这个好工具很好奇。我已经完成了 <h1> -标签。
    但是…我的问题是分析其余部分。这是由以下原因造成的:内容的标记可能会有所不同- <p> <div> <ul> … ATM这似乎或多或少地迭代了整个文档并解析了标签的标记…? 有什么暗示吗?

    4 回复  |  直到 9 年前
        1
  •  9
  •   Community Mofi    7 年前

    你真的需要 HTML parser 为此

        2
  •  6
  •   Mark Byers    14 年前

    不要使用regex解析HTML。考虑使用 HTML Agility Pack .

        3
  •  2
  •   lexmooze    13 年前

    有一些可能性:

    正则表达式 -快速但不可靠,它不能处理格式错误的HTML。

    HTMG -很好,但是有很多内存泄漏。如果你想处理一些文件,没有问题。

    SGMLRead -很好,但有个问题。有时它找不到默认的名称空间来获取其他节点,那么就不可能解析HTML。

    http://developer.mindtouch.com/SgmlReader

    雄伟-12 -很好,但不如sgmlreader快。

    http://www.majestic12.co.uk/projects/html_parser.php

    sgmlreader(vb.net)示例

    Dim sgmlReader As New Sgml.SgmlReader()
    Public htmldoc As New System.Xml.Linq.XDocument
    sgmlReader.DocType = "HTML"
    sgmlReader.WhitespaceHandling = System.Xml.WhitespaceHandling.All
    sgmlReader.CaseFolding = Sgml.CaseFolding.ToLower
    sgmlReader.InputStream = New System.IO.StringReader(vSource)
    sgmlReader.CaseFolding = CaseFolding.ToLower
    htmldoc = XDocument.Load(sgmlReader)    
    Dim XNS As XNamespace 
    
    ' In this part you can have a bug, sometimes it cant get the Default Namespace*********
    Try
          XNS = htmldoc.Root.GetDefaultNamespace
    Catch
            XNS = "http://www.w3.org/1999/xhtml"
    End Try
    If XNS.NamespaceName.Trim = "" Then
            XNS = "http://www.w3.org/1999/xhtml"
    End If
    
    'use it with the linq commands
    For Each link In htmldoc.Descendants(XNS + "script")
            Scripts &= link.Value
    Next
    

    在Majestic-12中,不同的是,您必须使用“Next”命令步行到每个标签。您可以使用DLL找到一个示例代码。

        4
  •  1
  •   Jim Brown    12 年前

    正如其他人提到的,使用htmlagilityPack。但是,如果您喜欢jquery/css选择器,我刚刚找到了一个名为fizzler的htmlagilityPack的分支: http://code.google.com/p/fizzler/ 用这个你可以找到所有 <p> 标签使用:

    var pTags = doc.DocumentNode.QuerySelectorAll('p').ToList();
    

    或者找到一个特定的类 <div id="myDiv"></div> :

    var myDiv = doc.DocumentNode.QuerySelectorAll('#myDiv');
    

    再简单不过了!