2013-02-27 9 views
9

ich html von anderen Seiten laden zu extrahieren und Anzeigen von Daten von dieser Seite:jQuery Parsen html ohne das Laden von Bildern

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

funktioniert das aber wegen der $(html) versucht mein Browser Bilder zu laden, die in 205 verbunden sind, .html. Diese Bilder existieren auf meiner Domain nicht, daher erhalte ich viele 404-Fehler.

Gibt es eine Möglichkeit, die Seite wie $(html) zu analysieren, aber ohne die ganze Seite in meinen Browser zu laden?

Antwort

15

Verwenden regex und entfernen Sie alle <img> Tags

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

die für mich gearbeitet. Beachten Sie, dass dies nicht für Stil-Hintergrundbilder funktioniert. Dazu benötigen Sie einen [XML-Parser] (http://stackoverflow.com/questions/11006216/load-an-html-string-into-jquery-without-request-images?rq=1), denke ich. Vielen Dank! – PiTheNumber

+0

@PiTheNumber & Bhuvan: FWIW, dass diese Regex trivial zu umgehen ist: http://jsbin.com/wejosoku/1 Ich würde gerne denken, dass es mit wiederholter Anwendung funktionieren würde, aber ich würde meine Seite nicht wetten wollen auf niemanden, der in der Lage ist, einen Weg zu finden. Regex ist grundsätzlich nicht für eine signifikante HTML-Analyse geeignet. –

+0

@ T.J.Crowder Ich weiß, es ist nicht sicher, aber in meinem Fall kann ich den anderen Domänen HTML-Code vertrauen. Regex ist schlecht für fast alles und ich rate dringend, es zu vermeiden, wo immer es möglich ist. Ich wäre glücklich, eine andere Lösung zu sehen, aber ein vollständiger HTML-Parser wäre zu groß dafür. – PiTheNumber

1

Sie könnte entweder jQuerys remove() Methode verwenden, um die Bildelemente

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

oder entfernen Sie aus dem HTML-String auszuwählen. So etwas wie

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

Hintergrundbilder betrifft, könnten Sie so etwas tun:

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

Erste hat nicht funktioniert. '$ (html)' lädt die Seite bereits. Der zweite hat funktioniert. Vielen Dank! – PiTheNumber

1

Die folgenden Regex ersetzen alle Vorkommen von <head>, <link>, <script>, <style>, einschließlich background und style Attribut von Daten Zeichenfolge zurückgegeben von Ajax laden.

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

-Test regex: https://regex101.com/r/nB1oP5/1

Ich wünschte, es eine bessere Art und Weise zu arbeiten um (andere als die Verwendung von Regex ersetzen).

3

Entschuldigung für die Wiederbelebung einer alten Frage, aber dies ist das erste Ergebnis bei der Suche nach dem Versuch, zu verhindern, dass geparste HTML externe Assets lädt.

Ich nahm Nik Ahmad Zainalddin die Antwort, aber es gibt eine Schwäche darin, dass alle Elemente zwischen <script> Tags ausgelöscht werden.

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

Im obigen Beispiel Inert text würde zusammen mit dem Script-Tags entfernt werden. Ich landete stattdessen tun die folgende up:

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, ""); 

Zusätzlich ich die Fähigkeit iframe s entfernen hinzugefügt.

Ich hoffe, das hilft jemandem.

0

Anstatt alle img Elemente ganz zu entfernen, können Sie den folgenden regulären Ausdruck verwenden, um alle src zu löschen Attribute statt:

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

Das würde den HTML-Code unterbrechen, weil das src-Attribut für das '' -Element zwingend erforderlich ist. Siehe https://developer.mozilla.org/de/docs/Web/HTML/Element/img – PiTheNumber

+0

Das mag wahr sein, aber es ist eine gute Alternative für alle, die img-Tag in ihrem CSS-Selektor verwenden oder Daten von einem der benötigen die Bildattribute. – Royalgamer06

Verwandte Themen