Eu procurei uma solução, mas nada era relevante, então aqui está o meu problema:
Eu quero analisar uma string que contém texto HTML. Eu quero fazer isso em JavaScript.
Eu tentei esta biblioteca, mas parece que ela analisa o HTML da minha página atual, não de uma string. Porque quando tento o código abaixo, ele altera o título da minha 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);
Meu objetivo é extrair links de uma página externa em HTML que eu li como uma string.
Você conhece uma API para fazer isso?
javascript
html
dom
html-parsing
palco
fonte
fonte
doc.getElementsByTagName('a')
para ler os links (ou mesmodoc.links
).Respostas:
Crie um elemento DOM fictício e adicione a string a ele. Em seguida, você pode manipulá-lo como qualquer elemento DOM.
Edit: adicionando uma resposta jQuery para agradar os fãs!
fonte
document.createElement('html');
para preservar as tags<head>
e<body>
.parse()
solução abaixo é mais reutilizável e elegante.É bem simples:
De acordo com o MDN , para fazer isso no chrome, você precisa analisar como XML da seguinte forma:
No momento, ele não é suportado pelo webkit e você teria que seguir a resposta de Florian, e é desconhecido que na maioria dos casos funcione em navegadores móveis.Edit: Agora amplamente suportado
fonte
documentURL
dewindow
, o que provavelmente difere da URL da string.new DOMParser
uma vez e, em seguida, reutilizar o mesmo objeto no restante do seu script.parse()
solução abaixo é mais reutilizável e específica para HTML. Isso é bom se você precisar de um documento XML, no entanto.EDIT: A solução abaixo é apenas para "fragmentos" de HTML, pois o html, a cabeça e o corpo são removidos. Eu acho que a solução para esta pergunta é o método parseFromString () do DOMParser.
Para fragmentos HTML, as soluções listadas aqui funcionam para a maioria dos HTML; no entanto, em certos casos, não funciona.
Por exemplo, tente analisar
<td>Test</td>
. Este não funcionará na solução div.innerHTML nem no DOMParser.prototype.parseFromString nem no range.createContextualFragment. A tag td desaparece e apenas o texto permanece.Somente o jQuery lida bem com esse caso.
Portanto, a solução futura (MS Edge 13+) é usar a tag template:
Para navegadores mais antigos, extraí o método parseHTML () do jQuery em uma lista independente - https://gist.github.com/Munawwar/6e6362dbdf77c7865a99
fonte
<template>
tag . Depende dos elementos personalizados que também podem ser necessários para o polyfill . Na verdade, você pode apenas querer usar o webcomponents.js para preencher polyfill elementos personalizados, modelos, sombra dom, promessas e algumas outras coisas de uma só vez.fonte
$
? Além disso, como mencionado na duplicata vinculada ,text/html
não é muito bem suportado e deve ser implementado usando um polyfill.DOMParser
nem funcionatext/html
no chrome, esta página MDN fornece uma solução alternativa.A maneira mais rápida de analisar HTML no Chrome e Firefox é Range # createContextualFragment:
Eu recomendaria criar uma função auxiliar que use createContextualFragment, se disponível, e retorne ao innerHTML.
Referência: http://jsperf.com/domparser-vs-createelement-innerhtml/3
fonte
innerHTML
, isso executará um<img>
'sonerror
.A seguinte função
parseHTML
retornará:a
Document
quando seu arquivo iniciar com um doctype.a
DocumentFragment
quando seu arquivo não iniciar com um doctype.O código :
Como usar :
fonte
trim
método em strings. Consulte stackoverflow.com/q/2308134/3210837 .Se você está aberto a usar o jQuery, ele possui algumas boas instalações para criar elementos DOM desanexados a partir de strings de HTML. Estes podem ser consultados através dos meios habituais, por exemplo:
Editar - apenas vi a resposta de @ Florian, que está correta. Isso é basicamente exatamente o que ele disse, mas com o jQuery.
fonte
Somente filhos válidos
Node
dentro do paiNode
(início doRange
) serão analisados. Caso contrário, poderão ocorrer resultados inesperados:fonte
Com este código simples, você pode fazer isso:
fonte