2009-11-29 25 views
7

La página que estoy viendo contiene:¿Cómo obtener la fuente html de un elemento específico con selenio?

<div id='1'> <p> text 1 <h1> text 2 </h1> text 3 <p> text 4 </p> </p> </div> 

quiero conseguir todo el texto en el div, excepto para el texto que se encuentra en la <h>. (Quiero obtener "texto 1", "texto 3" y "texto 4") Puede haber algunos elementos <h>, o ninguno en absoluto. Y puede haber algunos elementos <p>, incluso uno dentro del otro, o ninguno.

Pensé hacer esto obteniendo toda la fuente html del div, y usando una expresión regular para eliminar los elementos <h>. Pero selenium.get_text no devuelve el html, solo el texto (¡todo!).

Sé que puedo usar selenium.get_html_source y luego buscar el elemento que necesito con una expresión regular, pero que parece un desperdicio ya que el selenio sabe cómo encontrar el elemento.

¿Alguien tiene una mejor solución? Gracias :)

Respuesta

9

El siguiente código le dará el código HTML en el elemento div:

sel = selenium('localhost', 4444, browser, my_url) 
html = sel.get_eval("this.browserbot.getCurrentWindow().document.getElementById('1').innerHTML") 

continuación, puede utilizar BeautifulSoup analizarlo y extraer lo que realmente quiere.

espero que ayude

+0

¡Gracias! Resolvió el problema :) – Rivka

+0

¿por qué no aceptas la respuesta? :) – luc

+0

lo siento, soy nuevo en este sitio ... ¿Quisiste hacer clic en el v, derecho? – Rivka

1

¿Qué pasa con el uso de jQuery?

Editar:

En primer lugar hay que añadir los archivos .JS requeridas, para que van a www.jQuery.com.

Entonces todo lo que tiene que hacer es llamar a un simple selector de jQuery:

alert($("div#1").html()); 
+0

No sé jQuery. ¿Puede darme un ejemplo? Gracias! – Rivka

4

Uso XPath. De selenium.py:

Sin un prefijo de localización explícita, selenio presenta las siguientes estrategias: por defecto "documento"

  • \ ** ** dom \, para los localizadores que comienzan con
  • \ ** ** XPath \, para los localizadores que comienzan con "//"
  • \ ** ** identificador \, de lo contrario

En su caso, usted podría intentar

selenium.get_text("//div[@id='1']/descendant::*[not(self::h1)]") 

Puede obtener más información sobre xpath here.

P.S. No sé si hay buena documentación en HTML disponible para python-selenium, pero no he encontrado ninguna; por otro lado, los documentos del archivo selenium.py parecen constituir documentación completa. Así que sugeriría buscar la fuente para obtener una mejor comprensión de cómo funciona.

0

La respuesta seleccionada no funciona en Python 3 en el momento de la escritura. En su lugar, use esto:

from selenium import webdriver 

wd = webdriver.Firefox() 
wd.get(url) 
return wd.execute_script('return window.document.getElementById('1').innerHTML') 
Cuestiones relacionadas