2014-10-10 100 views
0

我有一个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" 
] 

我会怎么做,使用正则表达式和/或红宝石?我试着用split方法玩弄,比如html_body.split(">"),但仍然无法弄清楚如何正确地做到这一点。使用正则表达式和/或红宝石的正确方法是什么?

+2

使用适当的HTML解析器 - 在红宝石的情况下 - 引入nokogiri。 – nhahtdh 2014-10-10 02:31:40

回答

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

太棒了。我只是用你的方式尝试了它,它完美地工作。谢谢sawa! :) – sjsc 2014-10-10 02:59:46

+0

泽圭太嗨,我有一些麻烦提取多行机构和这里发布了一个新问题:http://stackoverflow.com/questions/26293459/extracting-multiple-line-content-under-header-tags – sjsc 2014-10-10 06:51:08

+0

你问题不在于多行,而在于多个节点。 – sawa 2014-10-10 07:14:34

1

您可以使用正则表达式

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

和修剪比赛以获得所需的输出。

DEMO

+0

太好了。谢谢阿米特:)有没有一种方法可以与体内的多条线相匹配?例如:http://rubular.com/r/gZjIV8W7Oj – sjsc 2014-10-10 03:05:28