2011-01-18 11 views
28

Ho notato qualcosa di strano usando Nokogiri di recente. Tutto il codice HTML che avevo analizzato era stato dato all'inizio e alla fine dei tag <html> e <body>.Come impedire a Nokogiri di aggiungere tag <DOCTYPE>?

<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" \"http://www.w3.org/TR/REC-html40/loose.dtd\">\n<html><body>\n 

Come impedire a Nokogiri di eseguire questa operazione?

IE, quando lo faccio:

doc = Nokogiri::HTML("<div>some content</div>") 
doc.to_s 

o:

doc.to_html 

ottengo l'originale:

<html blah><body>div>some content</div></body></html> 
+0

quale versione di Nokogiri? – shingara

+0

nokogiri (1.4.3.1) – holden

risposta

3

Il metodo to_s su un Nokogiri::HTML::Document emette una pagina HTML valido, completo con i suoi elementi richiesti. Questo non è necessariamente ciò che è stato passato al parser.

Se si desidera stampare meno di un documento completo, si utilizzano metodi come inner_html, inner_text, ecc. Su un nodo.

Modifica: se non si prevede di analizzare un documento XML completo e ben formato come input, la risposta diTinMan è la migliore.

77

Il problema si verifica perché si sta utilizzando il metodo sbagliato in Nokogiri per analizzare il contenuto.

require 'nokogiri' 

doc = Nokogiri::HTML('<p>foobar</p>') 
puts doc.to_html 
# >> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"> 
# >> <html><body><p>foobar</p></body></html> 

Invece di utilizzare HTML che si traduce in un documento completo, utilizzare HTML.fragment, che racconta Nokogiri desideri solo il frammento analizzato:

doc = Nokogiri::HTML.fragment('<p>foobar</p>') 
puts doc.to_html 
# >> <p>foobar</p> 
+1

Questa è la risposta corretta. Ignora la risposta qui sotto. Puoi selezionare la tua risposta come risposta corretta? È strano – rainkinz

+0

Solo per la cronaca, la risposta a cui Rainkinz si riferisce che dovrebbe essere ignorata :) –

+0

Grazie amico! Questa è la risposta corretta. –

Problemi correlati