3

早上好!我正在使用 c#(框架 3.5sp1)并想通过正则表达式解析以下 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>

我需要以下输出:

  • 第一组:h1的内容
  • 第 2 组:h1 跟随文本的内容
  • 第 3-n 组:子标题的内容 + 文本

我有什么自动取款机:

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

由于尾随<hr/>. 为了解析 h1 标题,我有另一个模式 ( <h1.*?>(.*?)</h1>),它只给我标题而不是内容 - 我对那个 atm 很好。

是否有人对我或任何替代逻辑有提示/解决方案(例如,通过阅读器解析 html 并以这种方式分配它?)?

编辑:
由于一些人引入了HTMLAgilityPack,我对这个不错的工具很好奇。我完成了获取<h1>-tag的内容。
但是......我的问题是解析其余的。这是由以下原因引起的:内容的标签可能会有所不同 - 从<p>to<div><ul>... atm 这似乎或多或少地迭代整个文档并解析标签的标签 ...?任何提示?

4

4 回答 4

9

你真的需要HTML解析器

于 2010-01-19T06:51:31.617 回答
6

不要使用正则表达式来解析 HTML。考虑使用HTML Agility Pack

于 2010-01-19T06:51:44.800 回答
2

有一些可能性:

REGEX - 快速但不可靠,它不能处理格式错误的 html。

HtmlAgilityPack - 很好,但有很多内存泄漏。如果你想处理几个文件,没有问题。

SGMLReader - 真的很好,但是有一个问题。有时找不到默认的命名空间来获取其他节点,则无法解析html。

http://developer.mindtouch.com/SgmlReader

Majestic-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 中不同的是,您必须使用“下一步”命令走到每个标签。您可以找到带有 dll 的示例代码。

于 2011-12-19T13:29:59.360 回答
1

正如其他人所提到的,使用 HtmlAgilityPack。但是,如果您喜欢 jQuery/CSS 选择器,我刚刚找到了一个名为 Fizzler 的 HtmlAgilityPack 的分支: http ://code.google.com/p/fizzler/ 使用它,您可以使用以下命令找到所有<p>标签:

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

或者找到一个特定的 div,例如<div id="myDiv"></div>

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

没有比这更容易的了!

于 2012-01-19T16:58:15.240 回答