Поиск отрисованных позиций HTML-элементов с помощью WebKit (или Gecko) - PullRequest
2 голосов
/ 11 июня 2009

Я хотел бы получить размеры (координаты) для всех элементов HTML веб-страницы в том виде, как они отображаются браузером, то есть в позициях, в которых они отображаются. Например, (top-left,top-right,bottom-left,bottom-right)

Не удалось найти это в lxml. Итак, есть ли библиотека в Python, которая делает это? Я также рассмотрел Mechanize :: Mozilla в Perl, но это кажется сложным для настройки / настройки.

Я думаю, что лучший способ сделать это для моих требований - это использовать механизм рендеринга, такой как WebKit или Gecko.

Существуют ли какие-либо привязки perl / python для двух вышеуказанных движков рендеринга? Google ищет учебники о том, как "подключить" к движку рендеринга WebKit, не очень полезно.

Ответы [ 7 ]

3 голосов
/ 11 июня 2009

lxml вам совсем не поможет. Он вообще не касается внешнего интерфейса.

Чтобы точно понять, как что-то рендерится, вам нужно сделать это. Для этого вам нужно подключиться к браузеру, создать страницу и запустить JS на странице, чтобы найти элемент DOM и получить его атрибуты.

Это вполне возможно, но я думаю, вам следует начать с рассмотрения того, как работают фабрики скриншотов веб-сайтов (поскольку они будут использовать 90% кода, необходимого для запуска браузера и показа нужной страницы).

Возможно, вы захотите использовать lxml для вставки вашего javascript на страницу.

1 голос
/ 09 октября 2010

у вас есть три основных варианта:

1) http://www.gnu.org/software/pythonwebkit на основе webkit;

2) python-comtypes для доступа к MSHTML (только для окон)

3) hulahop (python-xpcom) на основе xulrunner

вы должны получить исходный код пижамного рабочего стола и найти в каталоге pyjd / код «запуска», который позволит вам создать приложение веб-браузера и начать работу после того, как механизм обратного вызова «страница загружена» будет вызван движком , чтобы манипулировать DOM.

вы можете выполнять обход узлов и получать доступ к свойствам необходимых вам элементов DOM. вы можете заглянуть в модуль pyjamas / library / pajamas / DOM.py, чтобы увидеть многие вещи, которые вам нужно будет использовать, чтобы делать то, что вы хотите.

но если трех указанных выше вариантов недостаточно, вам следует прочитать страницу http://wiki.python.org/moin/WebBrowserProgramming, чтобы узнать о других вариантах, многие из которых упоминались здесь другими людьми.

л.

1 голос
/ 24 июня 2009

Мне не удалось найти какое-либо простое решение (например, Java / Perl / Python :) для подключения к Webkit / Gecko для решения вышеуказанной проблемы рендеринга. Лучшее, что я смог найти, это движок рендеринга Lobo , написанный на Java, с очень четким API, который делает именно то, что я хочу - доступ к DOM и атрибутам рендеринга HTML-элементов.

JRex - это оболочка Java для движка рендеринга Gecko.

1 голос
/ 11 июня 2009

Да, Javascript - это путь:

var allElements = document.getElementsByTagName ("*"); выберет все элементы на странице.

Затем вы можете просмотреть этот цикл и извлечь необходимую информацию из каждого элемента. Хорошая документация о получении размеров и положений элемента находится здесь.

getElementsByTagName возвращает список узлов, а не массив (поэтому, если ваш JS изменит ваш HTML, эти изменения будут отражены в списке узлов), поэтому я хотел бы собрать данные в запись AJAX и отправить ее на сервер, когда сделано.

1 голос
/ 11 июня 2009

Я согласен с Oli , поэтому рендеринг рассматриваемой страницы и проверка DOM с помощью JavaScript являются наиболее практичным способом.

Вы можете найти jQuery очень полезным здесь:

$(document).ready(function() {
    var elem = $("div#some_container_id h1")
    var elem_offset = elem.offset();
    /* elem_offset is an object literal:
       elem_offset = { x: 25, y: 140 }
    */
    var elem_height = elem.height();
    var elem_width = elem.width();
    /* bottom_right is then
       { x: elem_offset.x + elem_width,
         y: elem_offset.y + elem_height }
});

Соответствующая документация здесь .

0 голосов
/ 22 июня 2009

Вы можете посмотреть на WWW :: Selenium . С его помощью (и selenium rc ) вы можете использовать строку марионеток IE, Firefox или Safari изнутри Perl.

0 голосов
/ 11 июня 2009

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

Вы можете использовать элемент управления wxHTML из wxWidgets для визуализации каждой части страницы по отдельности, чтобы получить представление о ее размере.

Если у вас Mac, вы можете попробовать WebKit . В той же статье есть предложения по решениям и для других платформ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...