2016-04-05 2 views
1

Actuellement, j'essaie d'obtenir le code HTML interne d'un élément sur une page en utilisant nokogiri. Cependant, je ne reçois pas seulement le texte de l'élément, mais aussi ses séquences d'échappement. Est-il possible de les supprimer ou de les supprimer avec nokogiri?Obtention de l'objet Nokogiri inner_HTML pour ignorer/supprimer les séquences d'échappement

façon
require 'nokogiri' 
require 'open-uri' 

page = Nokogiri::HTML(open("http://the.page.url.com")) 

page.at_css("td[custom-attribute='foo']").parent.css('td').css('a').inner_html 

ce retour =>"\r\n\t\t\t\t\t\t\t\tTheActuallyInnerContentThatIWant\r\n\t"

Quel est le nokogiri le plus efficace et direct (ou rubis) de le faire?

+0

Quelles séquences d'échappement? Je ne vois que des onglets et de nouvelles lignes, qui seraient le contenu textuel des différents nœuds de texte. S'il vous plaît voir "[mcve]". Sans un échantillon minimal du HTML, il est difficile de donner une réponse détaillée. –

Répondre

2
page.at_css("td[custom-attribute='foo']") 
    .parent 
    .css('td') 
    .css('a') 
    .text    # since you need a text, not inner_html 
    .strip    # this will strip a result 

String#strip.

Sidenote: est probablement plus efficace que css('td').css('a').

0

Il est important d'explorer le noeud le plus proche contenant le texte que vous voulez. Considérez ceci:

require 'nokogiri' 

doc = Nokogiri::HTML(<<EOT) 
<html> 
    <body> 
    <p>foo</p> 
    </body> 
</html> 
EOT 

doc.at('body').inner_html # => "\n <p>foo</p>\n " 
doc.at('body').text # => "\n foo\n " 
doc.at('p').inner_html # => "foo" 
doc.at('p').text # => "foo" 

at, at_css et at_xpath retourner un nœud/XML :: Element. search, css et xpath renvoient un NodeSet. Il y a une grande différence dans la façon dont text ou inner_html informations de retour lors de la recherche à un nœud ou NodeSet:

doc = Nokogiri::HTML(<<EOT) 
<html> 
    <body> 
    <p>foo</p> 
    <p>bar</p> 
    </body> 
</html> 
EOT 

doc.at('p') # => #<Nokogiri::XML::Element:0x3fd635cf36f4 name="p" children=[#<Nokogiri::XML::Text:0x3fd635cf3514 "foo">]> 
doc.search('p') # => [#<Nokogiri::XML::Element:0x3fd635cf36f4 name="p" children=[#<Nokogiri::XML::Text:0x3fd635cf3514 "foo">]>, #<Nokogiri::XML::Element:0x3fd635cf32bc name="p" children=[#<Nokogiri::XML::Text:0x3fd635cf30dc "bar">]>] 

doc.at('p').class # => Nokogiri::XML::Element 
doc.search('p').class # => Nokogiri::XML::NodeSet 

doc.at('p').text # => "foo" 
doc.search('p').text # => "foobar" 

Notez que l'utilisation d'un search retourné NodeSet et que text renvoyé le texte du nœud concaténés. C'est rarement ce que tu veux. Notez également que Nokogiri est assez intelligent pour savoir si un sélecteur est CSS ou XPath 99% du temps, donc en utilisant le search générique et at pour l'un ou l'autre type de sélecteur est très pratique.

+0

C'était très utile! Je suis encore en train d'apprendre les in et out de 'at' et' search', donc ces exemples sont grandement appréciés! –