2012-06-22 28 views
13

Tôi đang sử dụng Nokogiri để phân tích một số html. Nhưng, tôi không biết làm thế nào có được html nguyên bên trong của một nút. Ví dụ, đưa ra:Nokogiri để nhận html thô của một nút

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

Khi tôi sử dụng xpath này:

doc = Nokogiri::HTML(html) 

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

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

Kết quả từ node.textnode.content là:

9746 
2012-06-26 

Tôi muốn có được tất cả html liệu bên trong tr khối. Trong trường hợp này:

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

Cách thích hợp để làm điều đó là gì?

Trả lời

14

Sử dụng node.to_s, hoặc chỉ node:

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

Với thêm sự tỉnh táo kiểm tra HTML (của bạn, tăng gấp đôi, với một tr của một lớp khác nhau ở giữa) tôi nhận được:

<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

Phương pháp đúng là .children. Nó trả về tất cả html bên trong phần tử đã chọn.

Vì vậy, có mã này:

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

Và việc sử dụng quá trình này:

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

Sẽ trở lại html này:

<td>value</td> 

Tôi đoán câu trả lời của tôi là quá muộn nhưng đó là mã chính xác bạn cần.

3

Bạn có thể thêm children.to_html. Hãy thử thực hiện điều đó bên dưới:

doc = Nokogiri::HTML(html) 

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

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

Tôi hy vọng điều này sẽ giúp bạn.

Các vấn đề liên quan