Я пытался PhantomJS , как в ответе katspaugh , но столкнулся с несколькими проблемами, пытаясь манипулировать страницами.Мой вариант использования заключался в изменении статического HTML-вывода Doxygen без изменения самого Doxygen.Цель состояла в том, чтобы уменьшить размер файла, удалив ненужные элементы со страницы, и преобразовать его в HTML5.Кроме того, я также хотел использовать jQuery для более легкого доступа к элементам и их изменения.
Загрузка страницы в PhantomJS
Похоже, что API сильно изменились со времени принятия ответа.Кроме того, я использовал другой подход (полученный из этого ответа ), который будет важен для смягчения одной из основных проблем, с которыми я столкнулся.
var system = require('system');
var fs = require('fs');
var page = require('webpage').create();
// Reading the page's content into your "webpage"
// This automatically refreshes the page
page.content = fs.read(system.args[1]);
// Make all your changes here
fs.write(system.args[2], page.content, 'w');
phantom.exit();
Предотвращение запуска JavaScript
Моя страница использует Google Analytics в нижнем колонтитуле, и теперь страница изменена вне моего намерения, предположительно потому, что был запущен JavaScript.Если мы отключим javascript, мы не сможем на самом деле использовать jQuery для изменения страницы, так что это не вариант.Я попытался временно изменить тег, но когда я это сделаю, каждый специальный символ заменяется на экранированный html-эквивалент, уничтожая весь код JavaScript на странице.Затем я наткнулся на этот ответ , который дал мне следующую идею:
var rawPageString = fs.read(system.args[1]);
rawPageString = rawPageString.replace(/<script type="text\/javascript"/g, "<script type='foo/bar'");
rawPageString = rawPageString.replace(/<script>/g, "<script type='foo/bar'>");
page.content = rawPageString;
// Make all your changes here
rawPageString = page.content;
rawPageString = rawPageString.replace(/<script type='foo\/bar'/g, "<script");
Добавление jQuery
На самом деле пример о том, какиспользовать JQuery.Тем не менее, я думал, что автономная копия будет более подходящей.Сначала я попытался использовать page.includeJs, как в примере, но обнаружил, что page.injectJs больше подходит для варианта использования.В отличие от includeJs, в контекст страницы не добавлен тег <script>
, и выполнение вызова блокирует, что упрощает код.jQuery был помещен в ту же директорию, из которой я выполнял свой скрипт.
page.injectJs("jquery-2.1.4.min.js");
page.evaluate(function () {
// Make all changes here
// Remove the foo/bar type more easily here
$("script[type^=foo]").removeAttr("type");
});
fs.write(system.args[2], page.content, 'w');
phantom.exit();
Собираем все вместе
var system = require('system');
var fs = require('fs');
var page = require('webpage').create();
var rawPageString = fs.read(system.args[1]);
// Prevent in-page javascript execution
rawPageString = rawPageString.replace(/<script type="text\/javascript"/g, "<script type='foo/bar'");
rawPageString = rawPageString.replace(/<script>/g, "<script type='foo/bar'>");
page.content = rawPageString;
page.injectJs("jquery-2.1.4.min.js");
page.evaluate(function () {
// Make all changes here
// Remove the foo/bar type
$("script[type^=foo]").removeAttr("type");
});
fs.write(system.args[2], page.content, 'w');
phantom.exit();
Используя его из командной строки:
phantomjs modify-html-file.js "input_file.html" "output_file.html"
Примечание: это было проверено и работало с PhantomJS 2.0.0 в Windows 8.1.
Совет Pro: Если скорость имеет значение, вам следует рассмотреть возможность итерации файлов внутри скрипта PhantomJS, а нескрипт оболочки.Это позволит избежать задержки, которую имеет PhantomJS при запуске.