尝试从非常大的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就是我正在做的所有事情。
答案 0 :(得分:0)
正如评论者已经指出的那样,您正在寻找的是
//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
元素添加到HTML文档的DOM树表示中,即使它实际上不存在。
确保您需要表达式中的所有谓词。对于您显示的输入样本,
//a/text()
也会选择正确的节点。