Как я могу использовать Nokogiri для анализа этого HTML? - PullRequest
1 голос
/ 20 февраля 2012

У меня есть такой 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 ]

2 голосов
/ 20 февраля 2012

Это также можно сделать с помощью двух операторов 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.

2 голосов
/ 20 февраля 2012
doc.xpath('//div[position()=1 or position()=3]/table/tr').map{|tr| tr.css('td')[0..1].map(&:text).join(' ')}
...