代码之家  ›  专栏  ›  技术社区  ›  Susheel Javadi

使用WebKit(或Gecko)查找呈现的HTML元素位置

  •  2
  • Susheel Javadi  · 技术社区  · 16 年前

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

    在lxml中找不到。那么,在Python中是否有这样的库?我也看过Perl中的机械化::Mozilla,但这似乎很难配置/设置。

    我认为实现这一点的最佳方法是使用渲染引擎,比如Webkit或Gecko。

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

    7 回复  |  直到 15 年前
        1
  •  3
  •   Oli    16 年前

    LXML根本帮不了你。它根本不关心前端渲染。

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

    这是完全可能的,但我认为你应该先看看网站截图工厂是如何工作的(因为他们会分享你启动浏览器并显示正确页面所需的90%代码)。

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

        2
  •  1
  •   Community Mohan Dere    8 年前

    我同意 Oli ,呈现有问题的页面和通过javascript检查dom是imho最实用的方法。

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

    相关文件是 here .

        3
  •  1
  •   edeverett    16 年前

    是的,Javascript是一种方法:

    var等位基因=document.getElementsByTagname(“*”);将选择页面中的所有元素。

    然后您可以通过这个循环,从每个元素中提取您需要的信息。有关获取元素尺寸和位置的良好文档 is here.

    GetElementsByTagname返回一个节点列表而不是数组(因此,如果您的JS更改了HTML,那么这些更改将反映在节点列表中),因此我将尝试将数据构建到Ajax日志中,并在完成后将其发送到服务器。

        4
  •  1
  •   Susheel Javadi    15 年前

    我无法找到任何简单的解决方案(如Java/Perl/Python),以钩住WebKe/GECKO来解决上述渲染问题。我能找到的最好的是 Lobo rendering engine 用Java编写的,它有一个非常明确的API,它可以实现我想要的——访问DOM和HTML元素的呈现属性。

    JRex 是一个Java封装的GECKO渲染引擎。

        5
  •  1
  •   user362834    15 年前

    您有三个主要选项:

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

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

    3)基于xulrunner的hulahop(python xpcom)

    您应该获取Pyjamas桌面源代码,并在pyjd/目录中查找“startup”代码,该代码允许您创建Web浏览器应用程序,并在引擎调用“page loaded”回调后开始操作DOM。

    您可以执行节点遍历,并可以访问所需的DOM元素的属性。您可以查看pyjamas/library/pyjamas/dom.py模块,了解您需要使用的许多东西,以便完成您想要的工作。

    但是如果上面的三个选项不够,那么你应该阅读这一页。 http://wiki.python.org/moin/WebBrowserProgramming 更多的选择,其中许多已经被其他人提到这里。

    L.

        6
  •  0
  •   Chas. Owens    16 年前

    你可以考虑看看 WWW::Selenium . 用它(和) selenium rc )您可以从Perl内部操纵字符串ie、firefox或safari。

        7
  •  0
  •   Jim Puls    16 年前

    问题是,当前的浏览器呈现的内容并不完全相同。如果您正在寻找符合标准的方式来做事情,那么您可以用Python编写一些东西来呈现页面,但这将是一项非常艰巨的工作。

    你可以用 wxHTML control from wxWidgets 单独呈现页面的每个部分以了解其大小。

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