2008-08-06 12 views
18

Estoy descargando una página web (etiqueta sopa HTML) con XMLHttpRequest y quiero tomar el resultado y convertirlo en un objeto DOM que luego puedo ejecutar consultas XPATH. ¿Cómo convierto una cadena en un objeto DOM?¿Cómo puedo convertir una cadena de HTML en un objeto DOM en una extensión de Firefox?

Parece que la solución general es crear un iframe oculto y arrojar el contenido de la cadena en eso. Ha habido talk de actualización de DOMParser para admitir texto/html pero a partir de Firefox 3.0.1 todavía obtienes un NS_ERROR_NOT_IMPLEMENTED si lo intentas.

¿Existe alguna opción además de usar el truco iframe oculto? Y si no, ¿cuál es la mejor manera de hacer el truco del iframe para que su código funcione fuera del contexto de las pestañas actualmente abiertas (para que las pestañas de cierre no dañen el código, etc.)?

This es un ejemplo de por qué estoy en busca de una solución que no sea el hack iframe, si tengo que escribir todo ese código para tener una solución robusta, entonces yo prefiero seguir buscando otra cosa.

Respuesta

4

Prueba esto:

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; 
    } 
} 

Aviso del overrideMimeType y responseXML.
ReadyState == 4 está 'completado'.

+0

Esto no funciona si la respuesta no es XML válido para empezar. Si le dices a Firefox que espere XML, será estricto sobre lo que se analizará. – thelsdj

1

intente crear un div

document.createElement('div'); 

y después fijar el código HTML sopa de etiqueta para el innerHTML del div. El navegador debe procesar eso en XML, que luego puede analizar.

La propiedad innerHTML toma una cadena que especifica una combinación válida de texto y elementos. Cuando se establece la propiedad innerHTML , la cadena dada reemplaza por completo el contenido existente del objeto. Si la cadena contiene etiquetas HTML, la cadena es analizada y formateada como se coloca en el documento.

+0

El problema con esto es que necesito todo el documento HTML, y todo lo que esto arrojaría. También intento no usar ventanas/pestañas existentes porque mi código se ejecuta fuera del contexto de ellas y quiero ser resistente a que un usuario cierre aleatoriamente una ventana o pestaña haciendo que mi código se interrumpa (suponiendo que Firefox todavía esté en ejecución) . – thelsdj

1

¿Desea descargar una página web como un objeto XML utilizando JavaScript, pero no desea utilizar una página web? Como no tiene control sobre lo que hará el usuario (cerrando pestañas o ventanas o lo que sea), tendrá que hacer esto como un widget de panel de OSX o alguna aplicación por separado. Una extensión de Firefox también funcionaría, a menos que tengas que preocuparte de que el usuario cierre el navegador.

+0

Sí, estoy usando una extensión de Firefox, pero la mayoría de los ejemplos de marcos flotantes usan una ventana de navegador arbitraria en lugar de un objeto en el proceso central para resistir el cierre del navegador/pestaña. – thelsdj

1

¿Hay alguna otra opción además de usar el truco del iframe oculto?

Lamentablemente, no, ahora no. De lo contrario, el código de microalumna que señale lo usaría en su lugar.

Y si no, ¿cuál es la mejor manera de hacer el truco iframe para que su código funcione fuera del contexto de las pestañas actualmente abiertas (para que las pestañas de cierre no dañen el código, etc.)?

El código que citó utiliza la ventana del navegador reciente, por lo que al cerrar las pestañas no se afectará el análisis. Cerrar esa ventana del navegador anulará su carga, pero puede manejarla (detectar que la carga se interrumpe y reiniciarla en otra ventana, por ejemplo) y no ocurre muy a menudo.

Necesita una ventana DOM para que el iframe funcione correctamente, por lo que no hay una solución limpia en este momento (si está interesado en usar el analizador Mozilla).

Cuestiones relacionadas