2012-02-20 87 views
1

我有一個HTML文檔這樣的:如何使用Nokogiri解析此HTML?

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html> 
<head> 
<meta http-equiv="Content-type" content="text/html; charset=utf-8" /> 
<title>Page Title</title> 
<style type="text/css"> 
</style> 
</head> 
<body> 

<div class="section"> 
    <table> 
     <tr> 
      <td>this_is_what_i_want</td><td>this_is_what_i_want</ 
td><td>test</td><td>test</td> 
     </tr> 
     <tr> 
      <td>this_is_what_i_want</td><td>this_is_what_i_want</ 
td><td>test</td><td>test</td> 
     </tr> 
     <tr> 
      <td>this_is_what_i_want</td><td>this_is_what_i_want</ 
td><td>test</td><td>test</td> 
     </tr> 
     <tr> 
      <td>this_is_what_i_want</td><td>this_is_what_i_want</ 
td><td>test</td><td>test</td> 
     </tr> 
    </table> 
</div> 

<div class="section"> 
    <table> 
     <tr> 
      <td>test</td><td>test</td><td>test</td><td>test</td> 
     </tr> 
     <tr> 
      <td>test</td><td>test</td><td>test</td><td>test</td> 
     </tr> 
     <tr> 
      <td>test</td><td>test</td><td>test</td><td>test</td> 
     </tr> 
     <tr> 
      <td>test</td><td>test</td><td>test</td><td>test</td> 
     </tr> 
    </table> 
</div> 

<div class="section"> 
    <table> 
     <tr> 
      <td>this_is_what_i_want</td><td>this_is_what_i_want</ 
td><td>test</td><td>test</td> 
     </tr> 
     <tr> 
      <td>this_is_what_i_want</td><td>this_is_what_i_want</ 
td><td>test</td><td>test</td> 
     </tr> 
     <tr> 
      <td>this_is_what_i_want</td><td>this_is_what_i_want</ 
td><td>test</td><td>test</td> 
     </tr> 
     <tr> 
      <td>this_is_what_i_want</td><td>this_is_what_i_want</ 
td><td>test</td><td>test</td> 
     </tr> 
    </table> 
</div> 

</body> 
</html> 

我想在第一時間拿到的所有行頭兩個td元素和 第三table元素。如何得到這個結果?

注意,在連續兩個td 元素有一定的關係,你不能把所有td 內容的相同方法。例如,如何連接連續兩個td元素的內容 ?

回答

2
doc.xpath('//div[position()=1 or position()=3]/table/tr').map{|tr| tr.css('td')[0..1].map(&:text).join(' ')} 
2

它還可以使用兩個XPath語句來完成:

doc.xpath('//div[position()=1 or position()=3]/table/tr').map {|row| row.xpath('concat(//td[1]," ",//td[2])')} 

的原因,它不能在一個XPath語句來完成是字符串XPath函數的第一個節點上運行僅限節點集。你可以做節點選擇或連接,但不能同時連接。

注意,在XPath 2.0中,它可以使用本string-join()函數來完成,但只有XPath 1.0中引入nokogiri支持。