2013-02-27 20 views
9

ho caricare html da altre pagine per estrarre e visualizzare i dati da quella pagina:jQuery analizzare HTML senza immagini di carico

$.get('http://domain.net/205.html', function(html){ 
    console.log($(html).find('#c1034')); 
}); 

che fa il lavoro, ma a causa della $(html) mio browser tenta di caricare le immagini che sono collegate in 205 .html. Quelle immagini non esistono sul mio dominio, quindi ricevo molti errori 404.

C'è un modo per analizzare la pagina come $(html) ma senza caricare l'intera pagina nel mio browser?

risposta

15

Usa espressione regolare e rimuovere tutti i tag <img>

html = html.replace(/<img[^>]*>/g,""); 
+0

che ha lavorato per me. Si noti che non funzionerebbe per immagini di sfondo di stile. Perciò si avrebbe bisogno di un [parser XML] (http://stackoverflow.com/questions/11006216/load-an-html-string-into-jquery-without-requesting-images?rq=1) immagino. Grazie! – PiTheNumber

+0

@PiTheNumber & Bhuvan: FWIW, che tale regex è banale per bypassare: http://jsbin.com/wejosoku/1 Mi piacerebbe pensare che avrebbe funzionato con l'applicazione ripetuto, ma non vorrei puntare il mio sito nessuno riuscendo a trovare un modo per aggirarlo. Regex è fondamentalmente inadatto a un significativo parsing HTML. –

+0

@ T.J.Crowder io so che non è salva, ma nel mio caso posso fidarmi l'altro codice HTML domini. Regex è male per lo più tutto e consiglio vivamente di evitarlo dove mai possibile. Sarei felice di vedere un'altra soluzione, ma un parser html completo sarebbe troppo grande per questo. – PiTheNumber

1

Si potrebbe usare sia jQuerys remove() metodo per selezionare gli elementi di immagine

console.log($(html).find('img').remove().end().find('#c1034')); 

o rimuovere poi dalla stringa HTML. Qualcosa di simile

console.log($(html.replace(/<img[^>]*>/g,""))); 

Per quanto riguarda le immagini di sfondo, si potrebbe fare qualcosa di simile:

$(html).filter(function() { 
    return $(this).css('background-image') !== ''; 
}).remove(); 
+0

Il primo non ha funzionato. '$ (html)' carica già la pagina. Il secondo ha funzionato. Grazie! – PiTheNumber

1

La seguente espressione regolare sostituisce tutte le occorrenze di <head>, <link>, <script>, <style>, incluso l'attributo background e style dalla stringa di dati restituita dal carico Ajax.

html = html.replace(/(<(\b(img|style|script|head|link)\b)(([^>]*\/>)|([^\7]*(<\/\2[^>]*>)))|(<\bimg\b)[^>]*>|(\b(background|style)\b=\s*"[^"]*"))/g,""); 

regex di prova: https://regex101.com/r/nB1oP5/1

Vorrei che ci sia un modo migliore per aggirare (tranne usando regex sostituire).

3

Siamo spiacenti per la rianimazione di una domanda precedente, ma questo è il primo risultato durante la ricerca di come provare a interrompere l'html analizzato dal caricamento di risorse esterne.

Ho preso la risposta di Nik Ahmad Zainalddin, tuttavia c'è un punto debole in quanto qualsiasi elemento tra i tag <script> viene cancellato.

<script> 
</script> 
Inert text 
<script> 
</script> 

Nell'esempio di cui sopra Inert text verrebbe eliminato insieme ai tag di script. Ho finito per fare la seguente invece:

html = html.replace(/<\s*(script|iframe)[^>]*>(?:[^<]*<)*?\/\1>/g, "").replace(/(<(\b(img|style|head|link)\b)(([^>]*\/>)|([^\7]*(<\/\2[^>]*>)))|(<\bimg\b)[^>]*>|(\b(background|style)\b=\s*"[^"]*"))/g, ""); 

Inoltre ho aggiunto la capacità di rimuovere iframe s.

Spero che questo aiuti qualcuno.

0

Invece di rimuovere tutti gli elementi img del tutto, è possibile utilizzare la seguente espressione regolare per cancellare tutti gli attributi src invece:

html = html.replace(/src="[^"]*"/ig, ""); 
+0

tale da rompere il html perché l'attributo src è obbligatorio per l'elemento '' . Vedere https://developer.mozilla.org/de/docs/Web/HTML/Element/img – PiTheNumber

+0

Potrebbe essere vero, ma è una buona soluzione alternativa per chiunque usi il tag img nel proprio selettore css o abbia bisogno di dati da uno dei gli attributi dell'immagine. – Royalgamer06