Какой запрос xpath решит это - PullRequest
0 голосов
/ 12 марта 2012

Какой запрос XPath можно использовать для решения ниже.Я на самом деле использую нокогири (в рубине), поэтому в идеале ответ должен быть в форме рубиновой формы нокогири, но в остальном просто XPath, и я могу адаптироваться.Я пытаюсь проанализировать приведенный ниже HTML (полная HTML-страница, но я просто скопировал / вставил соответствующую часть для ясности), и в конечном итоге получаю следующее:из Ruby / nokogiri это может быть в хэше, например:

% result = { "545454545" => "12345",  "3434343434" => "67890" }

HTML для анализа

.
.
.
<form method="post">
   <div style='line-height:18px;background-color:#FFFFFF;border: 1px #dedede solid;padding:10px;'>
   <table width='90%' border=0>
      <tr>
         <td width='30%'> Plan ID </td>
         <td width='70%'> 12345 </td>

      </tr>
      <tr>
         <td> Phone Number </td>
         <td> 545454545 </td>
      </tr>
      .
      .
      .
      </table>
   </div>
   <br>
   .
   .
   .
   <div style='line-height:18px;background-color:#FFFFFF;border: 1px #dedede solid;padding:10px;'>
   <table width='90%' border=0>
      <tr>
         <td width='30%'> Plan ID </td>
         <td width='70%'> 67890 </td>

      </tr>
      <tr>
         <td> Phone Number </td>
         <td> 3434343434 </td>
      </tr>
      .
      .
      .
      </table>
   </div>
   <br>

Ответы [ 2 ]

5 голосов
/ 12 марта 2012

Как насчет:

xpath = '//td[contains(text(),"Phone Number") or contains(text(),"Plan ID")]/following-sibling::td'
Hash[*doc.xpath(xpath).map{|x| x.text.strip}.reverse]
2 голосов
/ 12 марта 2012

Если предположить, что те строки, которые вы заменили периодами, не содержат данных, которые вы хотите собрать, что будет означать, что каждая таблица предоставит уникальный набор результатов, будет работать следующее:

#!/usr/bin/env ruby

require 'nokogiri'

doc = Nokogiri.HTML DATA.read
results = {}

doc.search('table').each do |table|
  plan_id = table.at('tr[1]/td[2]')
  phone_number = table.at('tr[2]/td[2]')

  if plan_id && phone_number
    results[phone_number.text.strip] = plan_id.text.strip
  end
end

p results #=> {"545454545"=>"12345", "3434343434"=>"67890"}

__END__
<form method="post">
   <div style='line-height:18px;background-color:#FFFFFF;border: 1px #dedede solid;padding:10px;'>
   <table width='90%' border=0>
      <tr>
         <td width='30%'> Plan ID </td>
         <td width='70%'> 12345 </td>

      </tr>
      <tr>
         <td> Phone Number </td>
         <td> 545454545 </td>
      </tr>
      .
      .
      .
      </table>
   </div>
   <br>
   .
   .
   .
   <div style='line-height:18px;background-color:#FFFFFF;border: 1px #dedede solid;padding:10px;'>
   <table width='90%' border=0>
      <tr>
         <td width='30%'> Plan ID </td>
         <td width='70%'> 67890 </td>

      </tr>
      <tr>
         <td> Phone Number </td>
         <td> 3434343434 </td>
      </tr>
      .
      .
      .
      </table>
   </div>
   <br>
...