2011-09-29 5 views
0

extrait pertinent de test.html:HTML grattage avec hpricot en utilisant Ruby 1.8.7 vs 1.9.2

<div id="seat_31F_vacant" class="seatVacant" onclick="UpdateHost(this);Common.DoPostBack('lbtPostBack','31F');" onmouseover="Seat_onMouseOver(this)" onmouseout="Seat_onMouseOut(this)">F</div> 

Ne manquez ce code ruby:

doc = Hpricot(test.html) 

doc.search("//div[@class='seats']").each do |seat|   
    @vacant_seat += seat.to_s.scan(/id="seat_(.*)_vacant/) 
end 

@log.info @vacant_seat.to_s 

Lorsque vous vous connectez @ vacant_seat.to_s cette est ce que je me retrouve avec:

[[ "31F"], [ "31E"], [ "31D"], [ "31C"]] (en utilisant 1.9.2)

31F31E31D31C (avec 1.8.7)

signifie que si je ne @vacant_seat [0] .to_s Je vais:

[ "31F"] (1.9.2) et 31F (1.8.7)

Je veux finir avec 31F (comme je le fais avec 1.8.7)

Y a-t-il des problèmes? Existe-t-il une façon générique de faire cela dans les deux versions de Ruby? J'ai besoin d'extraire la chaîne (par exemple 31F) qui se trouve entre les caractères de soulignement (_) dans les attributs ID. S'il y a une meilleure façon de faire cela, j'apprécierais d'en entendre parler.

+0

Comment cela est-il lié au concombre ou au watir? –

+0

Il serait plus facile de reproduire le problème si vous fournissez du code HTML pertinent. –

+0

Merci pour vos commentaires. Je veux l'utiliser plus tard pour automatiser quelques tests (en utilisant watir-webdriver et en cliquant sur les éléments collectés lors d'un test) et je pensais que c'était un problème courant pour les gens qui font ça (grattage htmls). Je peux aussi voir à quel point c'est plutôt Ruby, donc si vous pensez que les tags sont trompeurs, je peux les supprimer. – kfa

Répondre

1

Ruby 1.9.2 modifié en_s pour les tableaux. Il était utilisé pour concaténer tous les éléments et les imprimer comme 31F31E31D31C.

Maintenant, il ajoute un format de fantaisie pour le faire ressembler à un tableau, de sorte que vous voyez les crochets sur les tableaux, et les guillemets aux éléments de chaîne à l'intérieur d'eux, vous obtenez [["31F"], ["31E"], ["31D"], ["31C"]]. Il semble que @vacant_seat est un tableau de tableaux, c'est pourquoi @vacant_seat[0].to_s vous donne ["31F"].

Si vous avez juste besoin du tableau qui a les éléments, alors c'est le même tableau dans les deux, juste imprimé différemment.

Maintenant, vous pouvez utiliser join pour appeler ce qui était to_s dans 1.8.7. @vacant_seat.join #=> 31F31E31D31C ou @vacant_seat[0].join #=> 31F, vous donnera ce que vous cherchez.

+0

Merci pour votre réponse. Comment le même code pourrait-il être un tableau de tableaux pour 1.9.2? Je pense que les tableaux sont gérés de la même manière pour les deux versions. Vous semblez avoir un point sur la chose de mise en forme cependant .. la méthode to_s pour un tableau va les imprimer avec des parenthèses et des citations etc ... – kfa

Questions connexes