2011-05-13 11 views
5

Estoy tratando de extraer el nombre, identificación, teléfono, correo electrónico, género, origen étnico, fecha de nacimiento, clase, especialización, escuela y promedio de calificaciones de una página que estoy analizando con Nokogiri.¿Cómo uso Nokogiri y Ruby para eliminar valores de HTML con tablas anidadas?

Probé algunos diferentes de XPath pero todo lo que intento en juego mucho más de lo que yo quiero:

<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

+! Excelente trabajo que incluye una muestra del HTML real que necesita analizar. – Phrogz

Respuesta

5

que asumen que habrá muchos "Reclutar Perfil" vanos que son seguidos por las tablas que agrupan todos los detalles . El siguiente método toma su página entera HTML, se encuentra sólo a los vanos, y para cada uno de ellos se encuentra la siguiente tabla y luego encuentra los campos que desee en cualquier lugar por debajo de la mesa:

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"}] 

Una expresión XPath como .//foo[bar[text()="jim"]] significa:

  • Encuentra un elemento 'foo' en cualquier lugar bajo el nodo actual
  • ... pero sólo si se dispone de un elemento de 'bar' como un niño
  • ... pero sólo si ese elemento 'bar' tiene el texto "jim" como su contenido
expresión

Un XPath como following-sibling::... significa encuentra elementos que son hermanos después de que el nodo actual que coinciden con el expresión ...

la expresión XPath .../text() selecciona el Text node; el método text se usa para extraer el valor (cadena real) de ese nodo de texto.

El método xpath de Nokogiri devuelve una matriz de todos los elementos que coinciden con la expresión, mientras que el método at_xpath devuelve el primer elemento que coincide con la expresión.

+0

¡Gracias por la respuesta rápida! Voy a seguir probando esto en breve! – Sean

+0

Muchas gracias, después de hackearlo, ¡lo hice funcionar perfectamente! ¡Gracias! – Sean

+0

Para que lo sepas, si tuvieras un club de fans, yo sería el presidente. – Sean

Cuestiones relacionadas