2013-09-25 2 views
0

J'ai le bloc de code HTML suivant:Utiliser Nokogiri pour sélectionner un bloc de HTML basé sur du texte?

<tr> 
    <th>Consignment Service Code</th> 
    <td>ND16</td> 
</tr> 

Ce que je suis finalement essayer de tirer est cette chaîne ND16, mais pour ce faire, je dois sélectionner le <tr> en fonction du texte Consignment Service Code. J'utilise déjà Nokogiri pour analyser le code HTML, donc ce serait génial de continuer à l'utiliser. Alors, comment puis-je sélectionner ce bloc de HTML basé sur le texte "Consignment Service Code"?

+0

double possible de [Nokogiri: Comment sélectionner les noeuds par le texte correspondant] (http: // stackoverflow .com/questions/1474688/nokogiri-comment-sélectionner-les-noeuds-par-correspondance-texte) – Phrogz

Répondre

2

Vous pouvez le faire:

require 'nokogiri' 

doc=Nokogiri::HTML::parse <<-eot 
<tr> 
    <th>Consignment Service Code</th> 
    <td>ND16</td> 
</tr> 
eot 

node = doc.at_xpath("//*[text()='Consignment Service Code']/following-sibling::*[1]") 
puts node.text 
# >> ND16 

Voici un essai supplémentaire, ce qui pourrait vous aider à y aller:

## parent node 
parent_node = doc.at_xpath("//*[text()='Consignment Service Code']/..") 
puts parent_node.name # => tr 

## to get the child td 
puts parent_node.at_xpath("//td").text # => ND16 

puts parent_node.to_html 

#<tr> 
#<th>Consignment Service Code</th> 
# <td>ND16</td> 
#</tr> 
1

Encore une autre façon.

Utilisez la méthode css de Nokogiri pour trouver les nœuds tr appropriés, puis sélectionnez ceux qui ont le texte souhaité dans la balise th. Enfin, travailler avec les noeuds sélectionnés et extraire les valeurs td:

require 'nokogiri' 

str = '<tr> 
    <th>Consignment</th> 
    <td>ND15</td> 
</tr> 
<tr> 
    <th>Consignment Service Code</th> 
    <td>ND16</td> 
</tr> 
<tr> 
    <th>Consignment Service Code</th> 
    <td>ND17</td> 
</tr>' 

doc = Nokogiri::HTML.parse(str) 
nodes = doc.css('tr') 
      .select{|el| 
      el.css('th').text =~ /^Consignment Service Code$/ 
      } 

nodes.each do |el| 
    p el.css('td').text 
end 

sortie est:

"ND16" 
"ND17" 
+0

Vous pouvez utiliser ce http://api.jquery.com/text-selector/ lorsque vous utilisez '# css' méthode ... –

+0

Vous pourriez expliquer comment ce lien s'applique à 'css' de Nokogiri et cette réponse. –

Questions connexes