如何在标题标记下提取内容?

时间:2014-10-10 02:22:16

标签: ruby regex

我有一个像这样的HTML:

<div class="content">
  <h1>Title 1</h1>
  Lorem ipsum 1

  <h2>Title 2</h2>
  Lorem ipsum 2

  <h3>Title 3</h3>
  <b>Lorem ipsum 3</b>

  <h1>Title 4</h1>
  Lorem ipsum 4

  <h2>Title 5</h2>
  Lorem ipsum 5
</div>

我想在每个标题标题下提取内容并将它们放入一个数组中,如下所示:

[
  "Lorem ipsum 1",
  "Lorem ipsum 2",
  "<b>Lorem ipsum 3</b>",
  "Lorem ipsum 4",
  "Lorem ipsum 5"
]

如何使用正则表达式和/或ruby执行此操作?我尝试使用split方法,例如html_body.split(">"),但仍无法弄清楚如何正确执行此操作。使用正则表达式和/或ruby执行此操作的正确方法是什么?

2 个答案:

答案 0 :(得分:4)

你不应该重新发明轮子。使用Nokogiri比从头开始尝试更有力。

require "nokogiri"

html = <<_
<div class="content">
  <h1>Title 1</h1>
  Lorem ipsum 1

  <h2>Title 2</h2>
  Lorem ipsum 2

  <h3>Title 3</h3>
  <b>Lorem ipsum 3</b>

  <h1>Title 4</h1>
  Lorem ipsum 4

  <h2>Title 5</h2>
  Lorem ipsum 5
</div>
_

Nokogiri::HTML(html)
.css("div")
.children
.reject{|e| e.name =~ /\Ah\d\z/}
.map{|e| e.to_html.strip}.reject(&:empty?)

结果:

[
  "Lorem ipsum 1",
  "Lorem ipsum 2",
  "<b>Lorem ipsum 3</b>",
  "Lorem ipsum 4",
  "Lorem ipsum 5"
]

答案 1 :(得分:1)

您可以使用正则表达式

/(?<=<\/h\d>\n).*/gm

并修剪匹配以获得所需的输出。

DEMO