什么样的xpath查询可以解决这个问题



我可以使用什么XPath查询来解决以下问题。实际上,我使用的是nokogiri(在ruby中),所以理想情况下,答案应该是ruby形式的,但除此之外,只有XPath和我可以适应。

所需输出

我试图解析下面的HTML(一个完整的HTML页面,但为了清晰起见,我只是复制/粘贴了相关部分),最终基本上得到了以下内容:

Phone Number   Plan ID
545454545      12345
3434343434     67890

因此,在Ruby/nokogiri的上下文中,这可能是在Hash中,例如:

% 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>

怎么样:

xpath = '//td[contains(text(),"Phone Number") or contains(text(),"Plan ID")]/following-sibling::td'
Hash[*doc.xpath(xpath).map{|x| x.text.strip}.reverse]

假设用句点替换的那些行不包含要收集的数据,这意味着每个表都提供了一个唯一的结果集,那么以下方法将起作用:

#!/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>

最新更新