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()
变化三处:表达式中有tbody
,starts-with()
有两个参数(必须有两个)。最后还有text()
(只有select那些节点的文本内容)。
应用于您显示的文档时,结果为
[EMPTY LINE]
P-1-Z100D4
-----------------------
R-1-P110B680
[EMPTY LINE]
tbody
的存在通常会造成混淆,因为浏览器有时会在 HTML 文档的 DOM 树表示中添加 tbody
元素,即使它实际上不存在。
确保表达式中需要所有这些谓词。对于您显示的输入示例,
//a/text()
也会select正确的节点。
试图从非常大的 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()
变化三处:表达式中有tbody
,starts-with()
有两个参数(必须有两个)。最后还有text()
(只有select那些节点的文本内容)。
应用于您显示的文档时,结果为
[EMPTY LINE]
P-1-Z100D4
-----------------------
R-1-P110B680
[EMPTY LINE]
tbody
的存在通常会造成混淆,因为浏览器有时会在 HTML 文档的 DOM 树表示中添加 tbody
元素,即使它实际上不存在。
确保表达式中需要所有这些谓词。对于您显示的输入示例,
//a/text()
也会select正确的节点。