Поиск позиций визуализированных HTML-элементов с помощью WebKit (или Gecko)

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

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

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

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


person Susheel Javadi    schedule 11.06.2009    source источник
comment
Причина, по которой я пытаюсь напрямую подключиться к механизму рендеринга браузера, заключается в том, что мне нужно протестировать как минимум миллион URL-адресов, и я не думаю, что использование Selenium и т. Д. Было бы очень эффективным с этим. :)   -  person Susheel Javadi    schedule 23.06.2009


Ответы (7)


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

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

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

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

person Oli    schedule 11.06.2009
comment
Спасибо! Я посмотрел на Webkit (Pywebkitgtk) для рендеринга. Но в настоящее время он не поддерживает получение DOM — code.google.com. /p/pywebkitgtk/issues/detail?id=13 - person Susheel Javadi; 17.06.2009
comment
Манипулируйте HTML-кодом перед передачей его в браузер. Добавьте в блок javascript к AJAX правильные данные обратно к вам. - person Oli; 17.06.2009
comment
Собственно, я пытаюсь найти примеры использования движков рендеринга (будь то Gecko, Webkit). Но найти учебник практически невозможно. - person Susheel Javadi; 18.06.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 }
});

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

person muhuk    schedule 11.06.2009

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

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

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

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

person edeverett    schedule 11.06.2009

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

JRex — это оболочка Java для механизма рендеринга Gecko.

person Susheel Javadi    schedule 24.06.2009
comment
Ознакомьтесь с предложениями на этой странице: holovaty.com/writing/headless-html. -движок-рендеринга - person Susheel Javadi; 05.06.2012

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

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

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

3) hulahop (python-xpcom), основанный на xulrunner

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

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

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

l.

person user362834    schedule 09.10.2010
comment
Я не пробовал pythonwebkit (который был выпущен несколько дней назад)... но он действительно выглядит многообещающе. - person Susheel Javadi; 10.10.2010

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

person Chas. Owens    schedule 22.06.2009
comment
Причина, по которой я пытаюсь напрямую подключиться к механизму рендеринга браузера, заключается в том, что мне нужно протестировать как минимум миллион URL-адресов, и я не думаю, что использование Selenium и т. Д. Было бы очень эффективным с этим. :) - person Susheel Javadi; 23.06.2009
comment
да, это не так :) к счастью, вы можете адаптировать одну из сред выполнения пижамы для рабочего стола, чтобы просто создать графический интерфейс, который фактически не отображался на экране (иначе говоря, безголовое использование). если вы действительно хотите серьезно относиться к ресурсам, то создание безголовой версии pythonwebkit (без запуска GTK вообще) было бы хорошим способом. на программирование у меня ушло бы около 2 недель: свяжитесь со мной, если вы готовы заключить со мной контракт на выполнение работы (меня легко найти: погуглите luke leighton). - person user362834; 09.10.2010

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

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

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

person Jon Cage    schedule 11.06.2009