Ich habe nach einer Lösung gesucht, aber nichts war relevant. Hier ist mein Problem:
Ich möchte eine Zeichenfolge analysieren, die HTML-Text enthält. Ich möchte es in JavaScript tun.
Ich habe diese Bibliothek ausprobiert, aber es scheint, dass sie den HTML-Code meiner aktuellen Seite analysiert, nicht aus einer Zeichenfolge. Denn wenn ich den folgenden Code versuche, ändert sich der Titel meiner Seite:
var parser = new HTMLtoDOM("<html><head><title>titleTest</title></head><body><a href='test0'>test01</a><a href='test1'>test02</a><a href='test2'>test03</a></body></html>", document);
Mein Ziel ist es, Links von einer externen HTML-Seite zu extrahieren, die ich wie eine Zeichenfolge lese.
Kennen Sie eine API dafür?
javascript
html
dom
html-parsing
Bühne
quelle
quelle
doc.getElementsByTagName('a')
die Links lesen (oder sogardoc.links
).Antworten:
Erstellen Sie ein Dummy-DOM-Element und fügen Sie die Zeichenfolge hinzu. Dann können Sie es wie jedes DOM-Element bearbeiten.
Bearbeiten: Hinzufügen einer jQuery-Antwort, um die Fans zufrieden zu stellen!
quelle
document.createElement('html');
die<head>
und<body>
Tags zu bewahren .parse()
Lösung ist wiederverwendbarer und eleganter.Es ist ganz einfach:
Laut MDN müssen Sie dazu wie in Chrome Folgendes analysieren:
Es wird derzeit vom Webkit nicht unterstützt und Sie müssten Florians Antwort folgen. In den meisten Fällen funktioniert es nicht mit mobilen Browsern.Bearbeiten: Jetzt weit verbreitet unterstützt
quelle
documentURL
von erstellt wirdwindow
, was höchstwahrscheinlich von der URL der Zeichenfolge abweicht.new DOMParser
einmal aufrufen und dann dasselbe Objekt im Rest Ihres Skripts wiederverwenden sollten .parse()
Lösung ist wiederverwendbarer und spezifischer für HTML. Dies ist jedoch hilfreich, wenn Sie ein XML-Dokument benötigen.BEARBEITEN: Die folgende Lösung gilt nur für HTML- "Fragmente", da HTML, Kopf und Text entfernt werden. Ich denke, die Lösung für diese Frage ist die parseFromString () -Methode von DOMParser.
Für HTML-Fragmente funktionieren die hier aufgeführten Lösungen für die meisten HTML-Dateien, in bestimmten Fällen jedoch nicht.
Versuchen Sie beispielsweise das Parsen
<td>Test</td>
. Dieser funktioniert weder mit der div.innerHTML-Lösung noch mit DOMParser.prototype.parseFromString oder range.createContextualFragment. Das td-Tag geht verloren und nur der Text bleibt übrig.Nur jQuery behandelt diesen Fall gut.
Die zukünftige Lösung (MS Edge 13+) besteht also darin, ein Vorlagen-Tag zu verwenden:
Für ältere Browser habe ich die parseHTML () -Methode von jQuery in eine unabhängige Liste extrahiert - https://gist.github.com/Munawwar/6e6362dbdf77c7865a99
quelle
<template>
Tag mehrfach ausfüllen . Dies hängt von benutzerdefinierten Elementen ab, die Sie möglicherweise auch zum Polyfill benötigen . Tatsächlich möchten Sie möglicherweise nur webcomponents.js verwenden, um benutzerdefinierte Elemente, Vorlagen, Schattendom, Versprechen und einige andere Dinge auf einmal zu füllen.quelle
$
? Wie im verknüpften Duplikat erwähnt ,text/html
wird es auch nicht sehr gut unterstützt und muss mithilfe einer Polyfüllung implementiert werden.DOMParser
funktioniert keine dieser Arbeitentext/html
in Chrome. Diese MDN-Seite bietet eine Problemumgehung.Der schnellste Weg, um HTML in Chrome und Firefox zu analysieren, ist Range # createContextualFragment:
Ich würde empfehlen, eine Hilfsfunktion zu erstellen, die createContextualFragment verwendet, falls verfügbar, und ansonsten auf innerHTML zurückgreift.
Benchmark: http://jsperf.com/domparser-vs-createelement-innerhtml/3
quelle
innerHTML
ein<img>
's ausführtonerror
.Die folgende Funktion
parseHTML
gibt entweder zurück:a
Document
Wenn Ihre Datei mit einem Doctype beginnt.a
DocumentFragment
Wenn Ihre Datei nicht mit einem Doctype beginnt.Der Code :
Wie benutzt man :
quelle
trim
Methode für Zeichenfolgen nicht unterstützt . Siehe stackoverflow.com/q/2308134/3210837 .Wenn Sie für die Verwendung von jQuery offen sind, bietet es einige nützliche Funktionen zum Erstellen von getrennten DOM-Elementen aus HTML-Zeichenfolgen. Diese können dann mit den üblichen Mitteln abgefragt werden, zB:
Bearbeiten - habe gerade @ Florians Antwort gesehen, die richtig ist. Dies ist im Grunde genau das, was er gesagt hat, aber mit jQuery.
quelle
Es werden nur gültige Kinder
Node
innerhalb des ElternteilsNode
(Anfang desRange
) analysiert. Andernfalls können unerwartete Ergebnisse auftreten:quelle
Mit diesem einfachen Code können Sie das tun:
quelle