Busqué una solución pero nada era relevante, así que aquí está mi problema:
Quiero analizar una cadena que contiene texto HTML. Quiero hacerlo en JavaScript.
Probé esta biblioteca pero parece que analiza el HTML de mi página actual, no de una cadena. Porque cuando pruebo el siguiente código, cambia el título de mi página:
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);
Mi objetivo es extraer enlaces de una página externa HTML que leo como una cadena.
¿Conoces una API para hacerlo?
javascript
html
dom
html-parsing
etapa
fuente
fuente
doc.getElementsByTagName('a')
para leer los enlaces (o inclusodoc.links
).Respuestas:
Cree un elemento DOM ficticio y agréguele la cadena. Luego, puede manipularlo como cualquier elemento DOM.
Editar: agregar una respuesta jQuery para complacer a los fanáticos.
fuente
document.createElement('html');
para conservar las etiquetas<head>
y<body>
.parse()
solución a continuación es más reutilizable y elegante.Es bastante simple:
Según MDN , para hacer esto en Chrome, debe analizarlo como XML de la siguiente manera:
Actualmente no es compatible con webkit y tendría que seguir la respuesta de Florian, y se desconoce que funcione en la mayoría de los casos en navegadores móviles.Editar: ahora ampliamente compatible
fuente
documentURL
dewindow
, lo que probablemente difiere de la URL de la cadena.new DOMParser
una vez y luego reutilizar ese mismo objeto en el resto de su secuencia de comandos.parse()
solución a continuación es más reutilizable y específica para HTML. Sin embargo, esto es bueno si necesita un documento XML.EDITAR: La solución a continuación es solo para "fragmentos" HTML ya que se eliminan html, head y body. Supongo que la solución para esta pregunta es el método parseFromString () de DOMParser.
Para los fragmentos HTML, las soluciones enumeradas aquí funcionan para la mayoría de HTML, sin embargo, en ciertos casos no funcionará.
Por ejemplo, intente analizar
<td>Test</td>
. Este no funcionará en la solución div.innerHTML ni DOMParser.prototype.parseFromString ni en la solución range.createContextualFragment. La etiqueta td se pierde y solo queda el texto.Solo jQuery maneja bien ese caso.
Entonces, la solución futura (MS Edge 13+) es usar la etiqueta de plantilla:
Para navegadores más antiguos, he extraído el método parseHTML () de jQuery en una esencia independiente: https://gist.github.com/Munawwar/6e6362dbdf77c7865a99
fuente
<template>
etiqueta . Depende de elementos personalizados que también puede necesitar rellenar . De hecho, es posible que solo desee utilizar webcomponents.js para rellenar elementos personalizados, plantillas, domos de sombra, promesas y algunas otras cosas de una sola vez.fuente
$
? Además, como se menciona en el duplicado vinculado ,text/html
no se admite muy bien y debe implementarse utilizando un polyfill.DOMParser
tampoco funcionatext/html
en Chrome, esta página MDN ofrece una solución alternativa.La forma más rápida de analizar HTML en Chrome y Firefox es Range # createContextualFragment:
Recomendaría crear una función auxiliar que use createContextualFragment si está disponible y de lo contrario recurrirá a innerHTML.
Punto de referencia: http://jsperf.com/domparser-vs-createelement-innerhtml/3
fuente
innerHTML
, esto ejecutará un<img>
'sonerror
.La siguiente función
parseHTML
regresará:a
Document
cuando su archivo comienza con un doctype.a
DocumentFragment
cuando su archivo no comienza con un doctype.El código :
Cómo utilizar :
fuente
trim
método en cadenas. Ver stackoverflow.com/q/2308134/3210837 .Si está abierto a usar jQuery, tiene algunas buenas instalaciones para crear elementos DOM separados a partir de cadenas de HTML. Estos se pueden consultar a través de los medios habituales, por ejemplo:
Editar: acabo de ver la respuesta de @ Florian, que es correcta. Esto es básicamente exactamente lo que dijo, pero con jQuery.
fuente
Solo se analizarán los hijos válidos
Node
dentro del padreNode
(inicio deRange
). De lo contrario, pueden ocurrir resultados inesperados:fuente
con este simple código puedes hacer eso:
fuente