2012-01-25 83 views
0

如何從這個HTML代碼中提取:我怎麼能與<br>分隔符提取文本?

<body> 
    <div class="div1"> 
    <div class="div2"> 
     <div class="div3"> 
     <div class="div3.1"> 
      <h2 class="notopgap">HEADER</h2> 
      <br>DONT WANT THIS TEXT 
      <br><a href='mailto:[email protected]'>[email protected]</a> 
      <br><h2>I WANT THIS TEXT</h2> 
      <br>TEXT: WANT THIS 
      <br>DONT WANT THIS 
      <a name='#lev3'></a> 
      <h2>FINALLY I WANT THIS TOO</h2><br> 
      <div class="div3.1.1"> 
      BUNCH OF TEXT ... 

以下文字:

WANT THIS TEXT 
WANT THIS 
FINALLY I WANT THIS TOO 

與引入nokogiri /紅寶石?

我的div與其他元素只BR的提取,但我怎麼能做到這一點的時候有我想要的文本的每個部分之間沒有div但?

+2

你要的是什麼區別,你做什麼呢?特別是什麼決定你想要「TEXT:想要這個」,但不是「不想要這個」? –

+0

什麼區別是
TEXT:...直到下次
! – Fakada

+1

所以你想要的文字後面是「
」,但不是「*」後面跟着「
」的文字? –

回答

1

首先,您可以使用以下XPath:

doc = Nokogiri::HTML(html) 
doc.xpath("//div[@class='div3.1']/h2[not(@class = 'notopgap')]").map(&:text) 

將匹配的是要提取兩個<h2>標籤。提取其他條目更復雜。我的xpath功夫在這方面是欠缺的,因爲它與你不想捕捉的文字處於同一水平。

我可能會回落到對文本匹配。

text = doc.xpath("//div[@class='div3.1']").text() 
text.scan(/TEXT:(.*)\n/).flatten 
1

我寧願保持簡單:

require 'nokogiri' 

doc = Nokogiri::HTML(<<EOT) 
<body> 
<div class="div1"> 
<div class="div2"> 
<div class="div3"> 
    <div class="div3.1"> 
     <h2 class="notopgap">HEADER</h2> 
       <br>DONT WANT THIS TEXT 
       <br><a href='mailto:[email protected]'>[email protected]</a> 
       <br><h2>I WANT THIS TEXT</h2> 
       <br>TEXT: WANT THIS 
       <br>DONT WANT THIS 
       <a name='#lev3'></a> 
       <h2>FINALLY I WANT THIS TOO</h2><br> 
        <div class="div3.1.1"> 
EOT 

h2 = doc.search('h2') 
h2[1].text       # => "I WANT THIS TEXT" 
doc.search('br')[3].next_sibling.text # => "TEXT: WANT THIS\n    " 
h2[2].text       # => "FINALLY I WANT THIS TOO" 

從這一點很容易清理"TEXT: WANT THIS\n "

我知道我將會有多個匹配,所以不要嘗試使用XPath來獲取我想要的位置,一個簡單的CSS會查找有問題的標籤,然後我可以抓取特定的一個,然後繼續處理。

+1

與你的答案無關:我喜歡你的Gravatar'Redundant \:請參閱「冗餘」;-) – Bojangles

+0

@JamWaffles,LOL,你是第一個注意到的人。 –