2011-05-13 11 views
5

Nokogiri ile ayrıştırdığım bir sayfadan adı, kimliği, telefon, e-posta, cinsiyet, etnik köken, DOB, sınıf, büyük, okul ve GPA ayıklamak çalışıyorum. İç içe geçmiş tablolarla HTML'den değerler kazımak için Nokogiri ve Ruby'yi nasıl kullanırım?

bazı farklı xpath denedik ama her şey İstediğim çok daha fazla kapmak deneyin:

<span class="subTitle"><b>Recruit Profile</b></span> 
<br><table border="0" width="100%"><tr> 
<td> 
     <table bgcolor="#afafaf" border="0" cellpadding="0" width="100%"> 
<tr> 
<td> 
     <table bgcolor="#cccccc" border="0" cellpadding="2" cellspacing="2" width="100%"> 
<tr> 
<td bgcolor="#dddddd"><b>Name</b></td> 
      <td bgcolor="#dddddd">Some Person</td> 
     </tr> 
<tr> 
<td bgcolor="#dddddd"><b>EDU ID</b></td> 
      <td bgcolor="#dddddd">A12345678</td> 
     </tr> 
<tr> 
<td bgcolor="#dddddd"><b>Phone</b></td> 
      <td bgcolor="#dddddd">123-456-7890</td> 
     </tr> 
<tr> 
<td bgcolor="#dddddd"><b>Address</b></td> 
      <td bgcolor="#dddddd">1234 Somewhere Dr.<br>City ST, 12345</td> 
     </tr> 
<tr> 
<td bgcolor="#dddddd"><b>Email</b></td> 
      <td bgcolor="#dddddd">[email protected]</td> 
     </tr> 
<tr> 
<td bgcolor="#dddddd"><b>Gender</b></td> 
      <td bgcolor="#dddddd">Female</td> 
     </tr> 
<tr> 
<td bgcolor="#dddddd"><b>Ethnicity</b></td> 
      <td bgcolor="#dddddd">Unknown</td> 
     </tr> 
<tr> 
<td bgcolor="#dddddd"><b>Date of Birth</b></td> 
      <td bgcolor="#dddddd">Jan 1st, 1901</td> 
     </tr> 
<tr> 
<td bgcolor="#dddddd"><b>Class</b></td> 
      <td bgcolor="#dddddd">Sophomore</td> 
     </tr> 
<tr> 
<td bgcolor="#dddddd"><b>Major</b></td> 
      <td bgcolor="#dddddd">Biology</td> 
     </tr> 
<tr> 
<td bgcolor="#dddddd"><b>School</b></td> 
      <td bgcolor="#dddddd">University of Somewhere</td> 
     </tr> 
<tr> 
<td bgcolor="#dddddd"><b>GPA</b></td> 
      <td bgcolor="#dddddd">0.00</td> 
     </tr> 
<tr> 
<td bgcolor="#dddddd" valign="top"><b>Availability</b></td> 
      <td bgcolor="#dddddd"> 
     <table border="0" cellspacing="0" cellpadding="0"> 
<tr> 
+0

+! Ayrıştırmanız gereken gerçek HTML örneğini içeren mükemmel bir çalışma. – Phrogz

cevap

5

Tüm detayları tamamlamayı tablolar tarafından takip edilmektedir açıklıklı "Acemi Profil" Birçok olacağı varsayılmaktadır . Aşağıdaki yöntem, bütün HTML sayfası alır sadece bu açıklıklı bulur ve bunların her biri için aşağıdaki tabloyu bulur ve ardından alanlar her yerde o tablonun altında istediğiniz bulur:

require 'nokogiri' 

# Pass in or set the array of labels you want to use 
# Returns an array of hashes mapping these labels to the values 
def recruits_details(html,fields=%W[Name #{"EDU ID"} Phone Email Gender]) 
    doc = Nokogiri::HTML(html) 
    recruit_labels = doc.xpath('//span[b[text()="Recruit Profile"]]') 
    recruit_labels.map do |recruit_label| 
    recruit_table = recruit_label.at_xpath('following-sibling::table') 
    Hash[ fields.map do |field_label| 
     label_td = recruit_table.at_xpath(".//td[b[text()='#{field_label}']]") 
     [field_label, label_td.at_xpath('following-sibling::td/text()').text ] 
    end ] 
    end 
end 

require 'pp' 
pp recruits_details(html_string) 
#=> [{"Name"=>"Some Person", 
#=> "EDU ID"=>"A12345678", 
#=> "Phone"=>"123-456-7890", 
#=> "Email"=>"[email protected]", 
#=> "Gender"=>"Female"}] 

.//foo[bar[text()="jim"]] gibi bir XPath ifadesi şu anlama gelir:

  • yerde geçerli düğümün
  • altında 'foo' elemanını bul ... ama bir çocuk gibi bir 'bar' elemanını sahip olması gerekir
  • ... ama bu 'bar' öğesi kendi içeriği olarak "jim" metnini sahip olması gerekir
following-sibling::... gibi

Bir XPath ifadesi maç mevcut düğümün sonra kardeşler tüm elemanların bul demektir sentezleme ...

XPath ifadesi .../text()Text node seçer; text yöntemi, bu metin düğümünün değerini (gerçek dizgeyi) ayıklamak için kullanılır.

Nokogiri'nin xpath yöntemi, ifadeyle eşleşen tüm öğelerin bir dizisini döndürürken, at_xpath yöntemi ifadeyle eşleşen ilk öğeyi döndürür.

+0

Hızlı yanıt için teşekkürler! Bunu kısa bir süre test edeceğim! – Sean

+0

Çok teşekkür ederim, etrafta korsanlık yaptıktan sonra mükemmel çalışmaya başladım! Teşekkürler! – Sean

+0

Sadece bildiğiniz gibi, eğer bir hayran kulübünüz olsaydı, başkan olurdum. – Sean

İlgili konular