J'ai cherché une solution mais rien n'était pertinent, voici donc mon problème:
Je souhaite analyser une chaîne contenant du texte HTML. Je veux le faire en JavaScript.
J'ai essayé cette bibliothèque mais il semble qu'elle analyse le code HTML de ma page actuelle, pas à partir d'une chaîne. Parce que lorsque j'essaye le code ci-dessous, cela change le titre de ma page:
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);
Mon objectif est d'extraire des liens d'une page externe HTML que je lis comme une chaîne.
Connaissez-vous une API pour le faire?
javascript
html
dom
html-parsing
étape
la source
la source
doc.getElementsByTagName('a')
pour lire les liens (ou mêmedoc.links
).Réponses:
Créez un élément DOM factice et ajoutez-y la chaîne. Ensuite, vous pouvez le manipuler comme n'importe quel élément DOM.
Edit: ajouter une réponse jQuery pour faire plaisir aux fans!
la source
document.createElement('html');
pour conserver les balises<head>
et<body>
.parse()
solution ci-dessous est plus réutilisable et élégante.C'est assez simple:
Selon MDN , pour ce faire dans Chrome, vous devez analyser en XML comme ceci:
Il n'est actuellement pas pris en charge par le webkit et vous devrez suivre la réponse de Florian, et il est inconnu de fonctionner dans la plupart des cas sur les navigateurs mobiles.Edit: désormais largement pris en charge
la source
documentURL
ofwindow
, qui diffère très probablement de l'URL de la chaîne.new DOMParser
fois, puis réutiliser ce même objet dans le reste de votre script.parse()
solution ci-dessous est plus réutilisable et spécifique au HTML. Cependant, c'est bien si vous avez besoin d'un document XML.EDIT: La solution ci-dessous est uniquement pour les "fragments" HTML car le HTML, la tête et le corps sont supprimés. Je suppose que la solution à cette question est la méthode parseFromString () de DOMParser.
Pour les fragments HTML, les solutions répertoriées ici fonctionnent pour la plupart du HTML, mais dans certains cas cela ne fonctionnera pas.
Par exemple, essayez d'analyser
<td>Test</td>
. Celui-ci ne fonctionnera pas sur la solution div.innerHTML ni DOMParser.prototype.parseFromString ni range.createContextualFragment. La balise td disparaît et seul le texte reste.Seul jQuery gère bien ce cas.
Donc, la future solution (MS Edge 13+) consiste à utiliser la balise de modèle:
Pour les navigateurs plus anciens, j'ai extrait la méthode parseHTML () de jQuery dans un résumé indépendant - https://gist.github.com/Munawwar/6e6362dbdf77c7865a99
la source
<template>
balise de manière polyvalente . Cela dépend des éléments personnalisés que vous devrez peut-être également remplir . En fait, vous voudrez peut-être simplement utiliser webcomponents.js pour remplir des éléments personnalisés, des modèles, des shadow dom, des promesses et quelques autres choses en une seule fois.la source
$
? En outre, comme mentionné dans le doublon lié ,text/html
n'est pas très bien pris en charge et doit être implémenté à l'aide d'un polyfill.DOMParser
ni travailler surtext/html
Chrome, cette page MDN donne une solution de contournement.La façon la plus rapide d'analyser le HTML dans Chrome et Firefox est Range # createContextualFragment:
Je recommanderais de créer une fonction d'aide qui utilise createContextualFragment si disponible et retombe dans innerHTML sinon.
Indice de référence: http://jsperf.com/domparser-vs-createelement-innerhtml/3
la source
innerHTML
, cela exécutera un<img>
sonerror
.La fonction suivante
parseHTML
renverra soit:a
Document
lorsque votre fichier commence par un doctype.a
DocumentFragment
lorsque votre fichier ne commence pas par un doctype.Le code :
Comment utiliser :
la source
trim
méthode sur les chaînes. Voir stackoverflow.com/q/2308134/3210837 .Si vous êtes ouvert à l'utilisation de jQuery, il dispose de fonctionnalités intéressantes pour créer des éléments DOM détachés à partir de chaînes HTML. Ceux-ci peuvent ensuite être interrogés par les moyens habituels, par exemple:
Edit - vient de voir la réponse de @ Florian qui est correcte. C'est exactement ce qu'il a dit, mais avec jQuery.
la source
Seuls les enfants valides
Node
au sein du parentNode
(début duRange
) seront analysés. Sinon, des résultats inattendus peuvent se produire:la source
avec ce code simple, vous pouvez le faire:
la source