如何解析这段HTML?

时间:2010-01-19 06:49:23

标签: c# html html-agility-pack

早上好! 我正在使用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>

我需要以下输出:

  • 第1组:h1的内容
  • 第2组:h1后续文本的内容
  • 组3-n:子标题的内容+文本

我有什么atm:

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

由于尾​​随<hr/>,这将给我每个奇数子标题+内容(例如,1,3,...)。为了解析h1-caption我有另一种模式(<h1.*?>(.*?)</h1>),它只给我标题而不是内容 - 我对那个atm很好。

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

修改
正如一些人带来的HTMLAgilityPack,我很好奇这个好工具。我完成了<h1> - 标签的内容 但是...我的问题是解析其余部分。这是由以下原因引起的:内容的标记可能会有所不同 - 从<p><div><ul> ... atm这似乎或多或少地遍历整个文档并解析标签的标签......? 任何提示?

3 个答案:

答案 0 :(得分:9)

这个

你真的需要HTML parser

答案 1 :(得分:6)

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

答案 2 :(得分:1)

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

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

或找到像<div id="myDiv"></div>这样的特定div:

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

它不能比那更容易!