2

我想获取浏览器呈现网页的所有 HTML 元素的尺寸(坐标),即它们呈现的位置。例如,(top-left,top-right,bottom-left,bottom-right)

在 lxml 中找不到这个。那么,Python中是否有任何库可以做到这一点?我也看过 Perl 中的 Mechanize::Mozilla 但是,这似乎很难配置/设置。

我认为满足我的要求的最好方法是使用渲染引擎——比如 WebKit 或 Gecko。

以上两个渲染引擎是否有可用的 perl/python 绑定?谷歌搜索关于如何“插入”到 WebKit 渲染引擎的教程并不是很有帮助。

4

7 回答 7

3

lxml 根本不会帮助你。它根本不关心前端渲染。

为了准确地计算出某物的渲染方式,您需要对其进行渲染。为此,您需要连接到浏览器,生成页面并在页面上运行一些 JS 以查找 DOM 元素并获取其属性。

这完全有可能,但我认为您应该首先查看网站屏幕截图工厂的工作方式(因为它们将共享您启动浏览器并显示正确页面所需的 90% 的代码)。

您可能仍希望使用 lxml 将您的 javascript 注入页面。

于 2009-06-11T09:08:12.487 回答
1

我同意Oli的观点,呈现有问题的页面并通过 JavaScript 检查 DOM 是恕我直言最实用的方法。

你可能会发现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 }
});

相关文档在这里

于 2009-06-11T11:37:58.053 回答
1

是的,Javascript 是要走的路:

var allElements=document.getElementsByTagName("*"); 将选择页面中的所有元素。

然后你可以遍历这个从每个元素中提取你需要的信息。关于获取元素的尺寸和位置的好文档在这里。

getElementsByTagName 返回一个节点列表而不是一个数组(因此,如果您的 JS 更改了您的 HTML,这些更改将反映在节点列表中),所以我很想将数据构建到 AJAX 帖子中,并在完成后将其发送到服务器。

于 2009-06-11T11:51:05.400 回答
1

我找不到任何简单的解决方案(即 Java/Perl/Python :) 来连接到 Webkit/Gecko 以解决上述渲染问题。我能找到的最好的是用 Java 编写的Lobo 渲染引擎,它有一个非常清晰的 API,可以完全满足我的要求 - 访问 DOM 和 HTML 元素的渲染属性。

JRex是 Gecko 渲染引擎的 Java 包装器。

于 2009-06-24T13:38:28.667 回答
1

您有三个主要选择:

1) http://www.gnu.org/software/pythonwebkit是基于 webkit 的;

2) 用于访问 MSHTML 的 python-comtypes(仅限 Windows)

3) 基于 xulrunner 的 hulahop (python-xpcom)

您应该获取 pyjamas-desktop 源代码并在 pyjd/ 目录中查找“启动”代码,这将允许您创建 Web 浏览器应用程序并在引擎调用“页面加载”回调后开始操作DOM。

您可以执行节点遍历,并且可以访问所需的 DOM 元素的属性。您可以查看 pyjamas/library/pyjamas/DOM.py 模块,以了解您需要使用的许多东西才能做您想做的事。

但是如果上面的三个选项还不够,那么您应该阅读页面http://wiki.python.org/moin/WebBrowserProgramming以了解更多选项,其中许多选项已被其他人提到过。

l.

于 2010-10-09T19:02:50.697 回答
0

问题是当前的浏览器呈现的东西并不完全相同。如果您正在寻找符合标准的做事方式,您可能会在 Python 中编写一些东西来呈现页面,但这将是大量工作。

您可以使用wxWidgets 中的 wxHTML 控件单独呈现页面的每个部分,以了解其大小。

如果你有 Mac,你可以试试WebKit。同一篇文章也对其他平台上的解决方案提出了一些建议。

于 2009-06-11T09:25:48.597 回答
0

您可能会考虑查看WWW::Selenium。使用它(和selenium rc),您可以从 Perl 内部操纵字符串 IE、Firefox 或 Safari。

于 2009-06-22T19:56:38.570 回答