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()
также выбрал бы правильные узлы.