Actualización dinámica de datos de sensores de temperatura de un sitio web.

Escribí el siguiente código de Python:

from bs4 import BeautifulSoup import urllib2 url= 'http://www.example.com' page = urllib2.urlopen(url) soup = BeautifulSoup(page.read(),"html.parser") freq=soup.find('div', attrs={'id':'frequenz'}) print freq 

El resultado es:

 
tempsensor

Cuando veo este sitio con un navegador web, la página web muestra un contenido dynamic, no la cadena ‘tempsensor’. El valor de la temperatura se actualiza automáticamente cada segundo. Entonces, algo en la página web está reemplazando la cadena ‘tempsensor’ con un valor numérico automáticamente.

Mi problema es ahora: ¿Cómo puedo hacer que Python muestre el valor numérico actualizado? ¿Cómo puedo obtener el valor de la actualización automática de tempsensor en BeautifulSoup?

Lo sentimos No, no es posible con BeautifulSoup solo.

El problema es que BS4 no es un navegador web completo. Es sólo un analizador de HTML. No analiza CSS, ni Javascript.

Un navegador web completo hace al menos cuatro cosas:

  1. Se conecta a servidores web, recupera datos.
  2. Analiza el contenido HTML y el formato CSS y presenta una página web
  3. Analiza el contenido de Javascript, lo ejecuta.
  4. Proporciona la interacción del usuario para cosas como navegación del navegador, formularios HTML y una API de eventos para el progtwig Javascript

¿Todavía no estoy seguro? Ahora mira tu código. BS4 ni siquiera incluye el primer paso, ir a la página web, para hacerlo debe usar urllib2 .

Los sitios dynamics generalmente incluyen Javascript para ejecutarse en el navegador y actualizar periódicamente los contenidos. BS4 no proporciona eso y, por lo tanto, no los verá y, además, nunca usará solo BS4. ¿Por qué? Debido a que el elemento (3) anterior, la descarga y la ejecución del progtwig Javascript no está sucediendo. Se ejecutaría en IE, Firefox o Chrome, y es por eso que funcionan para mostrar contenido dynamic mientras que el raspado de BS4 solo no lo muestra.

PhantomJS y CasperJS proporcionan un navegador más mecanizado que a menudo puede ejecutar los códigos de JavaScript, lo que permite sitios web dynamics. Pero CasperJS y PhantomJS están progtwigdos en Javascript del lado del servidor, no en Python.

Aparentemente, algunas personas utilizan un navegador integrado en PyQt4 para este tipo de tareas de captura de pantalla dinámicas , aíslan parte del DOM y lo envían a BS4 para su análisis. Eso podría permitir una solución Python.

En los comentarios, @Cyphase sugiere que los datos exactos que desea pueden estar disponibles en una URL diferente, en cuyo caso se pueden buscar y analizar con urllib2 / BS4. Esto puede determinarse examinando cuidadosamente el Javascript que se está ejecutando en un sitio, en particular, puede buscar setTimeout y setInterval que progtwign actualizaciones, o ajax , o la función .load de jQuery para obtener datos del back-end. Los Javascripts para actualizaciones de contenido dynamic generalmente solo obtendrán datos de las URL de back-end del mismo sitio web. Si usan jQuery $('#frequenz') refiere al div, y al buscar esto en el JS puede encontrar el código que actualiza el div. Sin jQuery, la actualización de JS probablemente usaría document.getElementById('frequenz') .

Te estás perdiendo un poquito de código:

 from bs4 import BeautifulSoup import urllib2 url= 'http://www.example.com' page = urllib2.urlopen(url) soup = BeautifulSoup(page.read(), 'html.parser') freq = soup.find('div', attrs={'id':'frequenz'}) print freq.string # Added .string 

Esto debería hacerlo:

 freq.text.strip() 

Como en

 >>> html = '
tempsensor
' >>> soup = BeautifulSoup(html) >>> soup.text.strip() u'tempsensor'