2016-03-29 3 views
4

Ich versuche, ein HTML-Fragment mit einem benutzerdefinierten HTML-Tag mit Nokogiri zu analysieren.Analysieren eines HTML-Fragments, das einige benutzerdefinierte Tags auf die weiße Liste setzt

Beispiel:

string = "<div>hello</div>\n<custom-tag></custom-tag>" 

Ich habe versucht, es in vielerlei Hinsicht zu laden, aber keine ist optimal.

Wenn ich Nokogiri :: HTML:

doc = Nokogiri::HTML(string) 

Wenn ich to_html verwenden, es fügt einen doctype und einen html Tag, das den Inhalt umschließt. Es ist unerwünscht.

Wenn ich Nokogiri :: XML:

doc = Nokogiri::XML(string) 

ich Error at line 2: Extra content at the end of the document bekam, da in XML muss ein Root-Tag sein, dass alle Dokumentinhalt umschließt. Wenn ich versuche, wieder diesen Inhalt zu speichern, Der Ausgang ist <div>hello</div> (jeden Tag nach dem ersten entfernt)

Ich habe auch versucht doc = Nokogiri::HTML.fragment:

doc = Nokogiri::HTML.fragment(string) 

Aber es beschwert sich über die custom-tag.

Wie kann ich Nokogiri analysiert richtig mit diesem HTML-Fragmente?

+2

Was ist Ihr erwartetes Ergebnis? –

+0

@AmitSharma Ich erwarte, die Zeichenfolge ohne Fehler in HTML zu analysieren, auch wenn es ein 'custom-tag' enthält. Ich muss ein paar XPath-Abfragen machen, den Inhalt bearbeiten und serialisieren ohne Fehler zu HTML. – ProGM

+1

Haben Sie dieses 'doc = Nokogiri :: HTML (string) .inner_html' probiert? –

Antwort

4

doc = Nokogiri::HTML.fragment(string) ist der Weg zu gehen, können Sie ignorieren doc.errors beschweren sich über das ungültige Tag.

Sie sind gibt es ungültige HTML, so dass Sie nicht erwarten können, dass keine Fehler melden, aber HTML-Parser neigen dazu, zu vergeben.

Sie können auch Nokogiri::XML.fragment verwenden, wenn Sie den Rest davon sind sicher, wohlgeformt ist. Das gibt Ihnen keine Fehler bei undefinierten Tags.

+1

HTML-Parser in Browsern verzeihen nicht, sie versuchen nur, hilfreich zu sein und werden den HTML-Code neu schreiben, bis er syntaktisch korrekt ist, auch wenn das nicht der ursprünglichen Absicht entspricht. Nokogiri wird auch etwas reparieren. Zu wissen, dass 'doc.errors' sagt, dass es Probleme gibt, ist wichtig, da Tags während der Korrektur verschoben werden können. Es ist wahrscheinlich am einfachsten, Nokogiri zu erlauben, den Inhalt als ein XML-Fragment zu analysieren, da XML mehr unbekannte Tags akzeptiert, aber es hat immer noch eine starre Syntax, die HTML nicht hat, damit es nicht alle Probleme löst. –