2012-02-20 80 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支持。