2015-08-15 2 views
-1

Я написал следующий код 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 

Результат является:

<div id="frequenz" style="font-size:500%; font-weight: bold; width: 100%; height: 10%; margin-top: 5px; text-align: center">tempsensor</div> 

Когда я смотрю на этом сайте с помощью веб-браузера, веб страница показывает динамический контент, а не строку «tempsensor». Значение температуры автоматически обновляется каждую секунду. Итак, что-то на веб-странице автоматически заменяет строку «tempsensor» на числовое значение.

Моя проблема сейчас: Как я могу заставить Python показать обновленное числовое значение? Как я могу получить значение автоматического обновления до tempsensor в BeautifulSoup?

+2

«Как я могу оценить значение переменной tempsensor на python?» - Я не вижу никакой переменной ... – alfasin

+1

Каков фактический URL? –

+0

фактический URL-адрес http://www.netzfrequenz.info/charts/regelleistung –

ответ

-2

Вы пропустили крошечный кусочек кода:

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 
+0

Уход за разъяснением даун-голосования? – Cyphase

+1

freq.string дает мне только строку (имя) переменной, а не значение. В этом случае значение температуры обновляется каждую секунду. tempsensor - это только имя переменных. –

+0

А, я думал, ваш вопрос был просто странно сформулирован. Но о какой ценности вы говорите? Я ничего не вижу. – Cyphase

-2

Это следует сделать это:

freq.text.strip() 

Как и в

>>> html = '<div id="frequenz" style="font-size:500%; font-weight: bold; width: 100%; height: 10%; margin-top: 5px; text-align: center">tempsensor</div>' 
>>> soup = BeautifulSoup(html) 
>>> soup.text.strip() 
u'tempsensor' 
1

К сожалению нет, не возможно с BeautifulSoup в одиночку ,

Проблема в том, что BS4 не является полным веб-браузером. Это только парсер HTML. Он не анализирует CSS, ни Javascript.

Полный веб-браузер делает по крайней мере четыре вещи:

  1. Подключение к веб-серверам, распаковывает данные
  2. Анализирует HTML содержание и CSS форматирование и представляет веб-страницу
  3. содержание
  4. Анализирует Javascript, запускает его ,
  5. Обеспечивает взаимодействие пользователя для таких вещей, как навигации браузера, HTML-форм и с событиями API для программы Javascript

Все еще не уверен? Теперь посмотрите на свой код. BS4 даже не включает в себя первый шаг, выборку веб-страницы, чтобы сделать это, вам нужно было использовать urllib2.

Динамические сайты обычно включают Javascript для запуска в браузере и периодического обновления содержимого. BS4 не предоставляет этого, и поэтому вы их не увидите, а тем более никогда не будете использовать только BS4. Зачем? Поскольку пункт (3) выше, загрузка и выполнение программы Javascript не происходит. Это будет происходить в IE, Firefox или Chrome, и именно поэтому они работают, чтобы показать динамический контент, в то время как BS4-only scraping не показывает его.

PhantomJS и CasperJS предоставляют более механизированный браузер, который часто может запускать коды JavaScript, позволяющие динамически создавать веб-сайты. Но CasperJS и PhantomJS запрограммированы на серверном Javascript, а не на Python.

По-видимому, некоторые люди using a browser built into PyQt4 for these kinds of dynamic screenscaping tasks, изолируя часть DOM и отправляя это BS4 для синтаксического анализа. Это может привести к решению Python.

В комментариях @Cyphase предлагает, чтобы точные данные, которые вы хотите, могли быть доступны с другим URL-адресом, в этом случае он может быть извлечен и проанализирован с помощью urllib2/BS4. Это может быть определено путем тщательного изучения Javascript, который работает на сайте, в частности, вы можете искать setTimeout и setInterval, который планирует обновления, или ajax, или функцию .load jQuery для извлечения данных с задней стороны. Javascripts для обновлений динамического содержимого будет обычно только извлекать данные из внутренних URL-адресов одного и того же веб-сайта. Если они используют jQuery $('#frequenz') относится к div, и, ища это в JS, вы можете найти код, который обновляет div. Без jQuery обновление JS, вероятно, будет использовать document.getElementById('frequenz').

Смежные вопросы