2014-10-10 4 views
1

Я отправил аналогичный вопрос, который не учитывал несколько строк в теле. У меня есть HTML, как так, что я хочу, чтобы извлечь «тела» из (с использованием Nokogiri):Извлечение многострочного содержимого под заголовками

html = %q| 
    <div class="content"> 
     <h1>Title 1</h1> 
     Lorem ipsum 1 

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

     <h3>Title 3</h3> 
     <p>paragraph content 1</p> 
     <b>Lorem ipsum 3</b> 
     <p>paragraph content 2</p> 

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

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

Я хочу, чтобы извлечь содержимое тела под каждым заголовком заголовка и поместить их в массив так:

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

Однако, когда я делаю это:

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", 
    "<p>paragraph content 1</p>", 
    "<b>Lorem ipsum 3</b>", 
    "<p>paragraph content 2</p>", 
    "Lorem ipsum 4", 
    "Lorem ipsum 5" 
] 

Есть ли способ извлечь содержимое «тела» нескольких строк, чтобы отобразить мой желаемый массив?

+1

Ваша проблема не имеет ничего общего с несколькими строками, она связана с несколькими узлами DOM после заголовка. – sawa

ответ

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

Ах, я вижу это сейчас. Ты был прекрасен, видел. Я очень ценю вашу помощь! Большое вам спасибо! – sjsc

Смежные вопросы