2012-06-22 10 views
13

Sto utilizzando Nokogiri per analizzare alcuni html. Ma, non so come ottenere l'html raw all'interno di un nodo. Ad esempio, dato:Nokogiri per ottenere l'html grezzo di un nodo

<tr class="tableX"> 
    <td align="center"> 
    <font size="2"><a href="javascript:open('9746')">9746</a></font> 
    </td> 
    <td align="center"> 
    <font size="2">2012-06-26</font> 
    </td> 
</tr> 

Quando uso questo XPath:

doc = Nokogiri::HTML(html) 

nodes = doc.search("//tr[@class='tablebX']") 

nodes.each do |node| 
    node.text # or node.content 
end 

Il risultato da node.text e node.content sono:

9746 
2012-06-26 

Vorrei ottenere tutto l'HTML grezzo all'interno tr bloccare. In questo caso:

<td align="center"> 
    <font size="2"><a href="javascript:open('9746')">9746</a></font> 
</td> 
<td align="center"> 
    <font size="2">2012-06-26</font> 
</td> 

Qual è il modo corretto per farlo?

risposta

14

Usa node.to_s, o semplicemente node:

nodes = doc.search("//tr[@class='tablebX']") 
nodes.each do |node| 
    puts node.to_s 
    puts '-'*40 
end 

con l'aggiunta di sanity-check HTML (la tua, raddoppiati, con un tr di una classe diversa in mezzo) ottengo:

<tr class="tableX"> 
<td align="center"> 
<font size="2"><a href="javascript:open('9746')">9746</a></font> 
      </td> 
      <td align="center"><font size="2">2012-06-26</font></td> 
</tr> 
---------------------------------------- 
<tr class="tableX"> 
<td align="center"> 
<font size="2"><a href="javascript:open('9746')">9746</a></font> 
      </td> 
      <td align="center"><font size="2">2012-06-26</font></td> 
</tr> 
---------------------------------------- 
2

Il metodo corretto è .children. Restituisce tutto l'html all'interno dell'elemento selezionato.

Quindi, avendo questo codice:

<tr class="container"> 
    <td>value</td> 
</tr> 

E che utilizza questo processo:

data = Nokogiri::HTML(html) 
data.css("tr.container").children 

tornerà questo html:

<td>value</td> 

Credo che la mia risposta è troppo tardi, ma questo è il codici esatti di cui hai bisogno.

3

È possibile aggiungere children.to_html. Prova a farlo di seguito:

doc = Nokogiri::HTML(html) 

nodes = doc.search("//tr[@class='tablebX']") 

nodes.each do |node| 
    node.children.to_html # or node.content 
end 

Spero che questo ti aiuti.

Problemi correlati