2012-06-22 15 views
13

Estoy usando Nokogiri para analizar algunos html. Pero, no sé cómo obtener el html crudo dentro de un nodo. Por ejemplo, teniendo en cuenta:Nokogiri para obtener html en bruto de 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> 

Cuando utilizo este XPath:

doc = Nokogiri::HTML(html) 

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

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

El resultado de node.text y node.content son:

9746 
2012-06-26 

me gustaría obtener toda html cruda por dentro tr bloquear. En este 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> 

¿Cuál es la manera correcta de hacerlo?

Respuesta

14

Uso node.to_s, o simplemente node:

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

Con adicional cordura-cheque HTML (el suyo, se duplicaron, con un tr de una clase diferente en el medio) me sale:

<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

El método correcto es .children. Devuelve todo el html dentro del elemento seleccionado.

Así que tener este código:

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

Y que utiliza este proceso:

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

y retorna este html:

<td>value</td> 

Creo que mi respuesta es demasiado tarde, pero esa es la códigos exactos que necesitas

3

Puede agregar children.to_html. Intente hacer eso a continuación:

doc = Nokogiri::HTML(html) 

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

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

Espero que esto lo ayude.

Cuestiones relacionadas