Nokogiri帮助XPath无法正常工作

时间:2015-02-09 17:52:30

标签: ruby xpath nokogiri

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

我现在只是手动运行该文件,如果我可以让它工作,那么它将进入我的控制器。

我打算列出&#39; P-whatevers&#39;并将其减少到前5个字符,然后计算它们然后显示它们,但是现在正在剥离HTML就是我正在做的所有事情。

1 个答案:

答案 0 :(得分:0)

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

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

有三处变化:表达式中有tbodystarts-with()有两个参数(必须有两个)。最后,最后有text()(仅选择这些节点的文本内容)。

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

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

tbody的存在经常引起混淆,因为浏览器有时会将一个tbody元素添加到HTML文档的DOM树表示中,即使它实际上不存在。

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

//a/text()

也会选择正确的节点。