求助,为什么会报错'str' object has no attribute 'xpath'

这是大神的代码,运行的时候报错


在网上搜了很多解决办法都没有用
真的是个傻瓜小白,拜托各位了
}

1993年 Marc Andreessen 的团队开发了 Mosaic,1994年推出我们熟悉的 Netscape Navigator 网景浏览器,在最火爆的时候曾占是绝大多数人的选择。同时他还成立了网景公司。

1998年网景公司成立了 Mozilla 基金会组织,同时开源浏览器代码,2004年推出有多标签和支持扩展的 Firefox 火狐浏览器开始慢慢的占领市场份额。

完整的浏览器发展史可以在这里看:

可以看到浏览器技术的发展到了后期基本都是基于 WebKit 开发的,那么我们就来了解下 WebKit 吧。先看看它的全貌。 先看看它的大模块:

WebKit 为了能够具有 Chromium 那样的多进程优点而推出了 WebKit2 抽象出一组新的编程接口,下面是 WebKit2 的进程结构模型:

实线部分是共享的,虚线部分会根据不同的平台有不同的实现。

下面是 WebKit 最核心最复杂的排版引擎 WebCore 的结构图:

从网页 URL 到构建完 DOM 树的过程如图

  • WebCore:浏览器渲染引擎,包含了各个核心模块。
  • WebCore/page:页面相关的操作,页面结构和交互事件等。
  • WebCore/mathml:数学表达式在网页中的规范代码实现。
  • WebKit:平台相关的接口,每个目录都是不同的平台接口实现。
  • WTF:基础类库,类似 C++ 的 STL 库,有比如字符串操作,智能指针,线程等。

  • 内存管理:使用的引用计数,在 RefCounted 模板类里有 ref() 加和 unref() 减来进行控制,很多类都是继承了这个模板类。后期加入了 RefPtr 和 PassRefPtr 智能指针模板类,采用的是重载赋值操作符的方式能够自动完成计数加减,这样基本没有内存泄漏的可能。
  • 代码自动生成:C++ 对象到 JS 对象的 Binding 实现使用的是代码自动生成,用 Perl 脚本 根据 IDL 接口描述文件完成代码自动生成。还有部分 CSS 和 HTML 解析也用到了,这样 CSS 属性值和 HTML 标签属性的添加也够节省大量时间,需要修改 .in 配置文件即可。
  • 代码编写风格:可以在官网查看到: 想给 WebKit 做贡献的同学们可以好好看看了。

下面可以看看在 WebKit 里使用了哪些设计模式,是如何使用的。

  • 工厂模式:可以在 WebKit 源码里搜索结尾是 Factory 的代码,它们一般都是用的工厂模式。
  • 观察者模式:名称结尾是 Client 都是观察者模式,比如 FrameLoaderClient 可以看成是观察者类,被观察者 FrameLoader 会向 Client 观察者类通知自身状态的变化。

  • Frame:中心类,通过它找其它类
  • EventHandler:输入事件的处理,比如键盘,鼠标,触屏等

  • DOMWindow:管理 DOM 相关的事件,属性和消息。
  • Editor:管理页面比如 copy,paste和输入等编辑操作。

上图可以看到渲染引擎处于浏览器三层结构的最上层。下面是渲染的过程:

解析中发现 iframe 时的调用顺序

会创建出用于排版的 FrameView 对象。需要一些和排版相关的信息,比如初始 viewport 的大小,背景色,滚动条模式等,完成创建调用 Frame::setView 设置为当前 FrameView。 调用顺序

js 脚本更改数据时的调用顺序

全称是 Web Template Library,是 WebKit 的基础库,实现了智能指针,字符串和 Container,提供跨平台原子操作,时间和线程的封装,能够高效的对内存进行管理。WebCore 里都是 WTF 的代码而没有 STL。

对原生指针的封装,这样 C++ 可以自动化的实现资源管理和指针衍生操作比如拷贝,引用计数,autoLocker 和 Lazy evaluation 等。

智能指针主要就是实现动态分配对象的内存并且能自动回收,原理就是智能指针的对象会作为栈上分配的自动变量在退出作用域时被自动析构。

//指针运算,是为了让智能指针在行为上更类似原生指针 //创建智能指针对象格式

方法里完成,具体实现代码如下:

//先设置布局前 top 坐标 //保证 top 坐标和子节点布局后能够同步 //经过上面的子节点布局完后重新计算得到新高

判断值的类型是固定值还是百分比的方法

经过计算后的 Render Tree 具有布局信息,比如下面的 html 代码:

布局计算后带布局信息的 Render Tree 如下:

所有的 elements 都有 display 属性用来确定显示类型。属性值有

默认是 inline 的,但是浏览器会设置其它默认值,比如说 div 就是 block 的,完整的定义可以参看 w3c 定义的:

  • Float:会先按照正常流程来排列,然后再尽可能的往左或往右移动。

如果是 float 或者 inline-block ,宽度靠内容来撑,行内的内容会将间隔控制成一个空格,前后空格和多余空格都会忽略。

Block 是按照垂直排列,Inline 是按照水平来排列

下面举个例子看看 Inline 类型的例子,比如有如下的 html:

Relative:相对定位,先按照正常的定位然后根据设置的值再移动。

Float:会被移动到左边或右边侧

可以看到层级是按照 z-index 来排的。

border 及以内区域使用 m_frameRect 对象表示。不同方法通过不同的计算能够获取到不同的值比如 clientWidth 的计算方法是

位置的计算,即 x 和 y 是通过下面两个函数计算得到

计算是个递归过程,由子元素到父元素。这样做的原因是有的父元素的高是由子元素撑起的,需要先知道子元素才能够推出父元素。

}

我要回帖

更多关于 str object does not support 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信