如何使用Nokogiri解析此HTML



我有一个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元素第三CCD_ 2元素。如何得到这个结果?

注意两个td一行中的元素有某种关系,不能处理所有的td元素的方式相同。例如,如何连接一行中的两个CCD_ 5元素?

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

还可以使用两个XPath语句来完成:

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

无法在单个XPath语句中完成的原因是StringXPath函数仅在节点集的第一个节点上工作。可以进行节点选择或串联,但不能同时进行这两种操作。

注意,在XPath2.0中,可以使用string-join()函数来完成,但Nokogiri只支持XPath1.0。

相关内容

  • 没有找到相关文章