2008-08-06 18 views
18

Pobierałem stronę internetową (tag soup HTML) za pomocą XMLHttpRequest i chcę pobrać dane wyjściowe i przekształcić je w obiekt DOM, w którym będę mógł następnie uruchomić zapytania XPATH. Jak przekonwertować ciąg znaków na obiekt DOM?Jak zmienić ciąg znaków HTML w obiekt DOM w rozszerzeniu przeglądarki Firefox?

Wygląda na to, że ogólnym rozwiązaniem jest utworzenie ukrytego elementu iframe i umieszczenie w nim zawartości ciągu znaków. Odświeżono talk aktualizację DOMParser w celu obsługi tekstu/html, ale od wersji Firefox 3.0.1 nadal masz NS_ERROR_NOT_IMPLEMENTED, jeśli spróbujesz.

Czy jest jakaś opcja poza użyciem ukrytej sztuczki iframe? A jeśli nie, jaki jest najlepszy sposób na zrobienie sztuczki z elementu iframe, aby twój kod działał poza kontekstem aktualnie otwartych kart (aby zamykanie kart nie powodowało zepsucia kodu, itp.)?

This jest przykładem dlaczego szukam rozwiązania innego niż hack iframe, czy mam napisać wszystkie że kod, aby mieć solidne rozwiązanie, wtedy wolałbym zachować szuka czegoś innego.

Odpowiedz

4

Spróbuj tego:

var request = new XMLHttpRequest(); 

request.overrideMimeType('text/xml'); 
request.onreadystatechange = process; 
request.open ('GET', url); 
request.send(null); 

function process() { 
    if (request.readyState == 4 && request.status == 200) { 
     var xml = request.responseXML; 
    } 
} 

zauważy overrideMimeType i responseXML.
ReadyState == 4 jest "zakończone".

+0

To nie działa, jeśli odpowiedź nie jest poprawna XML na początek. Jeśli powiesz Firefoksie, że spodziewasz się XML-a, to będzie ścisłe o tym, co będzie analizować. – thelsdj

1

Spróbuj utworzyć div

document.createElement('div'); 

a następnie ustawić znacznik HTML zupa z innerHTML div. Przeglądarka powinna przetworzyć to na XML, który następnie można przeanalizować.

Właściwość innerHTML pobiera ciąg określająca prawidłową kombinację tekstu i elementów. Po ustawieniu właściwości innerHTML podany ciąg całkowicie zastępuje istniejącą zawartość obiektu. Jeśli ciąg znaków zawiera znaczniki HTML, ciąg znaków jest analizowany i formatowany, ponieważ jest umieszczany w dokumencie w postaci .

+0

Problem polega na tym, że potrzebuję całego dokumentu HTML, i wszystkiego, co to wyrzuciłoby. Staram się również nie używać istniejących okien/kart, ponieważ mój kod działa poza kontekstem ich i chcę być odporny na przypadkowe zamknięcie okna lub karty powodujące przerwanie mojego kodu (zakładając, że Firefox wciąż działa) . – thelsdj

1

Chcesz pobrać stronę internetową jako obiekt XML przy użyciu javascript, ale nie chcesz używać strony internetowej? Ponieważ nie masz kontroli nad tym, co zrobi użytkownik (zamykanie kart lub okien itp.), Musisz to zrobić w taki sam sposób, jak widżet pulpitu OSX lub osobna aplikacja. Rozszerzenie Firefox też by działało, chyba że musisz się martwić o użytkownika zamykającego przeglądarkę.

+0

Tak, używam rozszerzenia przeglądarki Firefox, ale większość przykładów elementów iframe używa raczej dowolnego okna przeglądarki niż obiektu w procesie podstawowym, aby być odpornym na zamykanie przeglądarki/karty. – thelsdj

1

Czy jest jakaś opcja poza użyciem ukrytej sztuczki iframe?

Niestety, nie, nie teraz. W przeciwnym razie kod mikropodsumowania, który wskażesz, użyje go zamiast tego.

A jeśli nie, co jest najlepszym sposobem, aby wykonać trick iframe tak, że kod działa poza kontekstem jakichkolwiek aktualnie otwartych kart (tak, że klapki zamykające nie zepsuć kod, itp)?

Cytowany kod wykorzystuje ostatnie okno przeglądarki, więc zamykanie kart nie ma wpływu na parsowanie. Zamknięcie okna przeglądarki przerwie obciążenie, ale możesz sobie z nim poradzić (wykryć, że ładunek został przerwany i na przykład uruchomić go w innym oknie) i nie zdarza się to zbyt często.

Potrzebujesz okna DOM, aby element iframe działał poprawnie, więc nie ma w tej chwili żadnego czystego rozwiązania (jeśli chcesz korzystać z parsera Mozilli).

Powiązane problemy