Nokogiri помочь XPath не работает

Попытка извлечь один маленький кусочек текста из очень большого HTML-документа. Однако независимо от того, какой метод чередования HTML-кода позволяет получить нужный текст, он все равно вытягивает весь HTML-код.

Часть HTML-кода, которую я пытаюсь получить, находится ниже. Все, что я хочу, это текст между < a >< /a > теги

<div id="countDetails_main">
<table id="countLevelDetailsTable" class="display" align="center" border="1" frame="void">
    <thead>
        <tr align="center">
            <th>Bin Id</th>
            <th>Created By User Id</th>
            <th>Creation Date</th>
            <th>Process Id</th>
            <th>Process Name</th>
            <th>Bin Status</th>
            <th>Counting Status</th>
        </tr>
    </thead>
    <tbody>

            <tr id="process-1">

                <td>
                    <a href="#" onclick="if (prepareLineItemDetailPane('process-1')) { initiateAjaxCall('process-1','-1'); }; return false;">
                        P-1-Z100D4
                    </a>
                </td>

                <td>jsickle</td>
                <td>Aug/21/2014-08:17:13</td>
                <td>433332</td>
                <td>AdHoc Process</td>
                <td>Count in process</td>
                <td>Pending</td>
            </tr>

            <tr id="process-2">

                <td>
                    <a href="#" onclick="if (prepareLineItemDetailPane('process-2')) { initiateAjaxCall('process-2','78856256'); }; return false;">
                        R-1-P110B680
                    </a>
                </td>

                <td>josephir</td>
                <td>Sep/12/2014-19:25:08</td>
                <td>433332</td>
                <td>AdHoc Process</td>
                <td>Count in process</td>
                <td>Pending</td>
            </tr>

Рубиновый код на данный момент:

#!/usr/bin/env ruby

require 'nokogiri'
require 'open-uri'

url ='http://secretwebsite.com/site/report/countLevelDetails.action?processId=433332&status=Pending'
results = `curl --negotiate -u: --location-trusted -c cookies.txt -b cookies.txt -i -v -k "#{url}"`
html_doc = Nokogiri::HTML(open(results))
html_doc.xpath('//table[@id="countLevelDetailsTable"]/tr[starts-with(@id="process-")]/td/a')
#html_doc.xpath("//table/tr/td/a")
#html_doc.search('a').map{ |a| [ a['href'], a.text ] }[0,5]

puts html_doc

Как вы можете сказать в файле ruby, я пробовал несколько способов. Ничто, кажется, не разбирает HTML.

Я просто вручную запускаю файл прямо сейчас, если я смогу заставить его работать, то он войдет в мой контроллер.

Я планирую взять список текста "P-whatevers" и сократить его до первых 5 символов, сосчитать их, а затем отобразить их, но сейчас я просто работаю над упрощением HTML.

1 ответ

Решение

Как уже заметил комментатор, вы ищете

//table[@id="countLevelDetailsTable"]/tbody/tr[starts-with(@id,"process-")]/td/a/text()

Есть три изменения: есть tbody в выражении и starts-with() имеет два аргумента (он должен иметь два). Наконец, есть text() в конце (выберите только текстовое содержимое этих узлов).

При применении к документу, который вы показываете, результат

[EMPTY LINE]
P-1-Z100D4
-----------------------
R-1-P110B680
[EMPTY LINE]

Наличие tbody часто является источником путаницы, потому что браузеры иногда добавляют tbody элемент представления дерева DOM HTML-документа, даже если его на самом деле нет.

Убедитесь, что вам нужны все эти предикаты в выражении. Для входного образца, который вы показываете,

//a/text()

также выбрал бы правильные узлы.

Другие вопросы по тегам