How to get the raw HTML of a node
Asked Answered
M

3

24

I am using Nokogiri to analyze some HTML, but, I don't know how get the raw HTML inside a node.

For example, given:

<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>

When I use this XPath selector:

doc = Nokogiri::HTML(html)

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

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

The results from node.text and node.content are:

9746
2012-06-26

I want to get all raw HTML inside the tr block, which, in this case, is:

<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>

What's the proper way to do that?

Mclellan answered 22/6, 2012 at 23:42 Comment(1)
Node's to_html will give you the original HTML.Xuanxunit
U
25

Use node.to_s, or just node:

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

With additional sanity-check HTML (yours, doubled, with a tr of a different class in the middle) I get:

<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>
----------------------------------------
Underbred answered 22/6, 2012 at 23:48 Comment(0)
L
7

You can add children.to_html. Try to do that below:

doc = Nokogiri::HTML(html)

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

nodes.each do |node|
   node.children.to_html # or node.content
end
Lithometeor answered 8/11, 2016 at 4:13 Comment(0)
G
2

The correct method is .children. It returns all the html inside the selected element.

So having this code:

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

And using this process:

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

Will return this html:

<td>value</td>

I guess my answer is too late but that's the exact codes you need.

Gobetween answered 27/6, 2014 at 16:28 Comment(1)
Children doesn't return raw HTML, it only returns the NodeSet containing the children of the parent node. The OP wants the raw HTML. Node#to_html or its aliases do that.Xuanxunit

© 2022 - 2024 — McMap. All rights reserved.