Nokogiri 帮助 XPath 不工作

Nokogiri help XPath not working

试图从非常大的 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>

Ruby 目前代码:

#!/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 就可以了我正在努力做。

正如评论者已经指出的那样,您正在寻找的是

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

变化三处:表达式中有tbodystarts-with()有两个参数(必须有两个)。最后还有text()(只有select那些节点的文本内容)。

应用于您显示的文档时,结果为

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

tbody 的存在通常会造成混淆,因为浏览器有时会在 HTML 文档的 DOM 树表示中添加 tbody 元素,即使它实际上不存在。

确保表达式中需要所有这些谓词。对于您显示的输入示例,

//a/text()

也会select正确的节点。