2015-12-16 3 views
2

У меня есть простой PhantomJS скрипт для разбора Javascript содержание сайта html. (Некоторые данные затем извлекаются из html кода с помощью другого инструмента.)Выбор пункта меню с помощью PhantomJS

var page = require('webpage').create(); 
var fs = require('fs');// File System Module 
var output = '/tmp/sourcefile'; // path for saving the local file 
page.open('targeturl', function() { // open the file 
    fs.write(output,page.content,'w'); // Write the page to the local file using page.content 
    phantom.exit(); // exit PhantomJs 
}); 

(я получил эти строки кода из http://kochi-coders.com/2014/05/06/scraping-a-javascript-enabled-web-page-using-beautiful-soup-and-phantomjs/)

Это используется для работы, когда все цели были прямые ссылки. Теперь они за тот же URL и есть выпадающее меню:

<select id="observation-station-menu" name="station" onchange="updateObservationProductsBasedOnForm(this);"> 
    <option value="101533">Alajärvi Möksy</option> 
    ...  
    <option value="101541">Äänekoski Kalaniemi</option> 
    </select> 

Это пункт меню, я бы на самом деле хотел бы загрузить:

<option value="101632">Joensuu Linnunlahti</option> 

Из этого меню мой скрипт загружает только данные, относящиеся к по умолчанию. Как я загружаю содержимое другого элемента из меню и загружаю его содержимое html?

Моя цель сайта заключается в следующем: http://ilmatieteenlaitos.fi/suomen-havainnot

(если есть лучший способ, чем PhantomJS для этого я мог бы использовать его так же хорошо, Мой интерес в работе с данными, один раз получить его соскабливают и я выбрал PhantomJS. . только потому, что это было первое, что работали некоторые варианты могут быть ограничены, потому что мой сервер является Raspberry Pi и может не работать на нем: Python Selenium: Firefox profile error)

ответ

1

Вы можете напрямую вызвать функцию, которая определена в нижележащих JS на этой странице:

var page = require('webpage').create(); 
var fs = require('fs');// File System Module 
var output = '/tmp/sourcefile'; // path for saving the local file 
page.open('targeturl', function() { // open the file 
    page.evaluate(function() { 
    updateObservationProducts(101632, 'weather'); 
    }); 
    window.setTimeout(function() { 
    fs.write(output,page.content,'w'); // Write the page to the local file using page.content 
    phantom.exit(); // exit PhantomJs 
    }, 1000); // Change timeout as required to allow sufficient time 

}); 

Для жду, чтобы сделать, увидеть эту phantomjs not waiting for "full" page load, я копия вставил часть из раствора rhunwicks.

+0

Это действовало аналогично другому ответу. Пропущено без ошибок, но содержит данные по умолчанию. –

+0

Я обновил решение, возможно, из-за этого. – user5542121

+0

Это решило, спасибо! –

3

Поскольку страницы есть JQuery, вы можете сделать:

page.open('targeturl', function() { // open the file 
    page.evaluate(function() { 
    jQuery('#observation-station-menu').val('101632').change(); 
    }); //change the checkbox, then fires the event 
    fs.write(output,page.content,'w'); // Write the page to the local file using page.content 
    phantom.exit(); // exit PhantomJs 
}); 
+0

Ваш вариант, вероятно, лучше, так как будет легче обновить, я думаю. – user5542121

+0

Я запустил это, но полученный файл все еще содержал информацию о выборе по умолчанию. Из файла: ' ' –

+0

@MadocComadrin Ну, есть задержка между изменением значения и просмотром нового изображения. Вам нужно добавить задержку в свой скрипт. –

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