我有一个这样的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
个元素?
答案 0 :(得分:2)
doc.xpath('//div[position()=1 or position()=3]/table/tr').map{|tr| tr.css('td')[0..1].map(&:text).join(' ')}
答案 1 :(得分:2)
也可以使用两个XPath语句来完成:
doc.xpath('//div[position()=1 or position()=3]/table/tr').map {|row| row.xpath('concat(//td[1]," ",//td[2])')}
在单个XPath语句中无法完成的原因是String XPath函数仅在节点集的第一个节点上工作。您可以进行节点选择或连接,但不能同时进行两者。
请注意,在XPath 2.0中,可以使用string-join()
函数完成,但Nokogiri仅支持XPath 1.0。