爬虫基础笔记

前言

浏览器的组成

User Interface

用户界面主要包括工具栏、地址栏、前进/后退按钮、书签菜单、可视化页面加载进度、智能下载处理、首选项、打印等。除了浏览器主窗口显示请求的页面之外,其他显示的部分都属于用户界面。用户界面还可以与桌面环境集成,以提供浏览器会话管理或与其他桌面应用程序的通信。

Browser engine

浏览器引擎是一个可嵌入的组件,其为渲染引擎提供高级接口。
浏览器引擎可以加载一个给定的URI,并支持诸如:前进/后退/重新加载等浏览操作。
浏览器引擎提供查看浏览会话的各个方面的挂钩,例如:当前页面加载进度、JavaScript alert。
浏览器引擎还允许查询/修改渲染引擎设置。

Rendering engine

渲染引擎,也被称为浏览器内核。
作用:在UI与rendering engine间传递命令。
渲染引擎为指定的URI生成可视化的表示。
渲染引擎能够显示HTML和XML文档,可选择CSS样式,以及嵌入式内容(如图片)。
渲染引擎能够准确计算页面布局,可使用“回流”算法逐步调整页面元素的位置。
渲染引擎内部包含HTML解析器。

Networking

网络系统实现HTTP和FTP等文件传输协议。 网络系统可以在不同的字符集之间进行转换,为文件解析MIME媒体类型。 网络系统可以实现最近检索资源的缓存功能。

JavaScript Interpreter

JavaScript解释器能够解释并执行嵌入在网页中的JavaScript(又称ECMAScript)代码。 为了安全起见,浏览器引擎或渲染引擎可能会禁用某些JavaScript功能,如弹出窗口的打开。

XML Parser

XML解析器可以将XML文档解析成DOM树。 XML解析器是浏览器架构中复用最多的子系统之一,几乎所有的浏览器实现都利用现有的XML解析器,而不是从头开始创建自己的XML解析器。

Display Backend

显示后端提供绘图和窗口原语,包括:用户界面控件集合、字体集合。

Data Persistence

数据持久层将与浏览会话相关联的各种数据存储在硬盘上。 这些数据可能是诸如:书签、工具栏设置等这样的高级数据,也可能是诸如:Cookie,安全证书、缓存等这样的低级数据。

功能相似的HTML解析器和XML解析器为什么前者划分在渲染引擎中,后者作为独立的系统?
XML解析器对于系统来说,其功能并不是关键性的,但是从复用角度来说,XML解析器是一个通用的,可重用的组件,具有标准的,定义明确的接口。相比之下,HTML解析器通常与渲染引擎紧耦合。

渲染引擎介绍

渲染引擎工作流程

Process HTML markup and bulid the DOM tree
Process CSS markup and bulid the CSSOM tree
Combine the DOM and CSSOM into a render tree
Run layout on the render tree to compute geometry of each node
Paint the individual nodes to the screen

渲染引擎使用HTML解析器(调用XML解析器)解析HTML(XML)文档,将各个HTML(XML)元素逐个转化成DOM节点,从而生成DOM树。
同时,渲染引擎使用CSS解析器解析外部CSS文件以及HTML(XML)元素中的样式规则。元素中带有视觉指令的样式规则将用于下一步,以创建另一个树结构:渲染树。

渲染引擎使用第1步CSS解析器解析得到的样式规则,将其附着到DOM树上,从而构成渲染树。
渲染树包含多个带有视觉属性(如颜色和尺寸)的矩形。这些矩形的排列顺序就是它们将在屏幕上显示的顺序。

渲染树构建完毕之后,进入本阶段进行“布局”,也就是为每个节点分配一个应出现在屏幕上的确切坐标。

渲染引擎将遍历渲染树,并调用显示后端将每个节点绘制出来。

渲染引擎组成模块

HTML(XML)解析器

解析HTML(XML)文档,主要作用是将HTML(XML)文档转换成DOM树。

DOM:Document Object Model(文档对象模型)

DOM是W3C(World Wide Web Consortium,万维网联盟)解析的标准,用于将标记文档封装成对象,并将标记型文档中的所有的内容(标签、文本、属性等)都封装成对象。

1)封装成对象的目的:为了更方便的操作这些文档以及文档中的所有内容
因为对象的出现就可以有属性和行为被调用

2)文档对象模型含义
文档:标记型文档
对象:封装了属性和行为的实例,可以被直接调用
模型:所有标记型文档都具备一些共型特征的体现
标记型文档(标签、属性、标签中的封装的数据)

3)只要是标记型文档,DOM这个技术都可以对其进行操作。常见的标记型文档:html、xml
DOM这种技术是如何对标记型文档进行操作的?
要操作标记型文档必须对其进行解析

4)DOM树
DOM技术的解析方式:将标记型文档解析成DOM树,并将文档中的内容都封装成节点
将页面看成文档document

5)DOM解析方式的好处:可以将书中的节点进行任意操作,比如:增删改查

弊端:这种解析需要将整个标记型文档加载进内存,意味着如果标记型文档的内容的体积很大,较为浪费内存空间

一、DOM3种模型
DOM level 1:将html文档封装成对象
DOM level 2:在level 1基础上加入了新功能,比如解析名称空间
名称空间:《html xmlns=”http://www.w3.org/1999/xhtml”》避免不同网页的标签冲突,http://www.w3.org/1999/xhtml是个域名,域名是唯一的,不会导致命名冲突
DOM level 3:将xml文档封装成对象

二、DHTML:
动态的HTML,不是语言,是多种语言综合体的简称:HTML、CSS、DOM、JavaScript
这四个技术在动态html页面效果定义时,都处于什么样的效果?负责什么样的职责?

①HTML:负责提供标签,对数据进行封装,目的是便于对该标签进行操作
简单说:用便签封装数据
②CSS:负责提供样式属性,对标签中的数据进行样式的定义
简单说:对数据新型样式定义
③DOM:负责将标记型文档以及文档中的所有内容进行解析,并封装成对象,在对象中定义了更多的属性和行为,便于对对象进行操作
简单说:将文档和标签以及其他内容变成对象
④JS:负责提供程序设计语言,对页面中的对象进行逻辑操作。
简单说:负责页面的行为定义,就是页面的动态效果
JavaScript是动态效果的主力编程语言

CSS解析器

将DOM中的各个元素对象进行计算,获取样式信息,用于渲染树的构建。

JavaScript解释器

使用JavaScript可以修改网页的内容、CSS规则等。JavaScript解释器能够解释JavaScript代码,并通过DOM接口和CSSOM接口来修改网页内容、样式规则,从而改变渲染结果。

顾名思义,js引擎就是用来执行javascript代码的, 简单的举个例子,一个计算圆周率的网页,渲染引擎把页面的框架显示出来,最终的结果要用javascript来计算,所以javascript引擎的快慢也是对整个网页的速度有很大的影响,特别是最近 目前越来越多的类似webQQ、Gmail等大量复杂的基于javascript运算的网站,不同的执行引擎的速度的差别很显然易见

为甚么要单独拿出来说,因为还涉及到跑分,现在通俗的说那个浏览器更快,实际上是指执行javascript脚本的速度也就是javascript的渲染速度,而不是页面的载入速度,在

网速允许的情况下,其实各浏览器的网页载入的速度差别不是很大,由于现在javascript在页面中的比重越来越大,越来越多的动态画面开始大量借助于javascript,比如现在主流的SNS、邮箱、网页游戏,所以javascript的渲染速度也是一个很重要的指标,javascript的渲染速度越快,动态页面的显示也就是越快,opera在javascript引擎的跑分上一直是遥遥领先的,一般来说在最新版本之间PK,opera基本上都会夺冠

JS引擎类型:
chakra:IE9启用的新的javascript引擎

spidermonkey /tracemonkey/jaegerMonkey
spidermonkey应用在mozilla firefox1.0-3.0版本上
tracemomonkey 应用在3.0-4.,0版本上
jaegermonkey应用在4.0及以后新的版本上

v8引擎:一般应用在chrome 遨游3浏览器上

Nitro:应用于 safari 4及以后的版本上

linear A/ linear B /futhark/carakan
linear A 用于Opera4.0-6.1版本
linear B用于opera7.0-9.2版本
futhark应用于opera9.5-10.2版本
carakan用于Opera10.5及后续的版本

KJS:KHTML对应的javascript引擎

布局

渲染树中每个节点在屏幕中的位置。HTML采用基于流的布局模型,这意味这大多数情况只需一次遍历就能计算出几何位置,并且靠后的位置并不影响前面的几何位置,因此布局可以从左到右、从上到下的遍历渲染书。也有例外,比如表格需要不止一次遍历。

DOM创建之后,渲染引擎将其中的元素对象与样式规则进行结合,可以得到渲染树。布局则是针对渲染树,计算其各个元素的大小、位置等布局信息。

绘图

使用UI Back-end Layer将每个节点画在屏幕上。
绘制顺序:background color, background image, border, children, outline
需要注意的是,这个main flow是渐进的过程,为了提升用户体验,渲染引擎会尽快将画面展示在屏幕上,而不是等到整个HTML文档分析完,才构建渲染树等后续操作。在不断从网络接收过程中,会将parse部分内容呈现出来。

使用图形库将布局计算后的渲染树绘制成可视化的图像结果。

常用渲染引擎

Trident内核(window)

基于Trident内核的浏览器有:ie6,ie7,ie8(Trident 4.0) , ie9(trident 5.0) , ie10(trident6.0)

Trident就是大名鼎鼎的IE浏览器所使用的内核,也是很多浏览器所使用的内核,MS现在采用的越来越少,反之使用webkit的越来越多,老的trident内核(比如IE6)当年占得市场份额很大,后果就是大量的网页是专门为IE6等老trident内核编写,但这些网页的代码并不符合w3c标准,于是完全符合w3c标准的网页在老trident内核下出现了偏差,这就是为什么后来很多人觉得后来的IE9网页排版有点混乱,而IE6正常,其实不是浏览器的兼容性差了,而是你访问的的网页不符合新的标准,目前可供调用的最新版的Trident内核是IE9使用的内核,较之前的版本对w3c的标准支持增了很多

Gecko(跨平台)

Natescape6启用的内核,现在又mozilla基金会进行维护,是开源的浏览器内核,目前主流的Gecko内核是mozilla firefox, 由于firefox的出现,IE的霸主地位逐渐被削弱,chrome的出现加速了这个进程,非trident内核的兴起逐渐改变了整个互联网的格局,最直接的推动是编码的标准化,也使MS在竞争的压力下不得不改进IE,不过可惜的是,虽然是开源的,也开发了这么多年,基于Gecko的浏览器并不多见,除了一些简单的改动或者重新编译,深度定制或者增了强外壳的还是比较少见。另外就是一些软件借用了Gecko,比如音乐管理软件songbird

khtml(linux)

KDE开发的内核,速度快捷,容错率低,这种内核不见得有很多人知道,但后面看下去你就会明白,常见的khtml内核的浏览器有:konqueror

webkit(跨平台)

常见的基于webkit内核的浏览器主要有:apple 的safari(win/mac/iphone/ipad) 、google的chrome、塞班手机浏览器、android手机默认的浏览器

由khtml发展而来,也是apple给开源世界的一大贡献,是目前最火热的浏览器内核,火热的不是说它的市场份额,而是应用的面积和势头,因为脱胎于khtml,所以具有高速的特点,同样遵守w3c标准,从目前来看,webkit内核是最具有潜力而且是已经有相当成绩的新型内核,性能非常好,对w3c标准的支持也非常完善,本人十分看好他

Presto(跨平台)

opera所 采用的内核,准确的说是opera7.0及以后的版本采用的内核,之前的版本采用的内核是elektra, 无容置疑,Presto内核对w3c的支持也很良好,presto对页面文字的解析方面的性能比webkit还要高,对页面有较高的阅读性

补充

网页类型

动态页bai:.asp/.aspx/.jsp
静态页:.htm/.html/.shtml
org

user_agent(UA)

标题UA格式

UA格式:Mozilla/MozillaVersion(platform,security,os-or-cpu;localization information;prereleaseVersion) Gecko/Geckoversion ApplicationProduct/ApplicationProductVersion

MozillaVersion–MozillaVersion的版本

platform-----------操作系统类型,包括WINdows,Mac,Unix

security-----------可为I N U

os-or-cpu---------windows系统下:winNT/win95 ;Mac系统下:代表cpu类型,为68k/ppc ;Unix系统下:从uname-sm中获得

localization information-------浏览器使用的语言,典型的为美国的en-US

prereleaseVersion--------用于这个浏览器的开放源代码的Mozilla代码的基础版本。

Geckoversion ----使用Gecko渲染引擎的版本,这里按照yyyymmdd的日期

ApplicationProduct---------使用Mozilla代码的品牌浏览器的名称。

UA示例

PC端

Opera
“Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 OPR/26.0.1656.60”
“Opera/8.0 (Windows NT 5.1; U; en)”
“Mozilla/5.0 (Windows NT 5.1; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.50”
“Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 9.50”

Firefox
“Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0”
“Mozilla/5.0 (X11; U; Linux x86_64; zh-CN; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10”

safari 5.1 – MAC
“Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50”

safari 5.1 – Windows
“Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50”

Safari
“Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2”

chrome
“Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36”
“Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11”
“Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16”

傲游(Maxthon)
“Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Maxthon 2.0)”

腾讯TT
“Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; TencentTraveler 4.0)”

世界之窗(The World) 2.x
“Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)”

世界之窗(The World) 3.x
“Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; The World)”

搜狗浏览器 1.x
“Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SE 2.X MetaSr 1.0; SE 2.X MetaSr 1.0; .NET CLR 2.0.50727; SE 2.X MetaSr 1.0)”

360浏览器
“Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)”
“Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36”
“Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko”

Avant
“Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Avant Browser)”

Green Browser
" Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)"

IE 9.0
“Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;)”

IE 8.0
“Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)”

IE 7.0
“Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)”

IE 6.0
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1) "

淘宝浏览器
“Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.11 TaoBrowser/2.0 Safari/536.11"

猎豹浏览器
”Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER"
“Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; LBBROWSER) “
”Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E; LBBROWSER)"

QQ浏览器
“Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; QQBrowser/7.0.3698.400)”
”Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E)"

sogou浏览器
“Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.84 Safari/535.11 SE 2.X MetaSr 1.0"
”Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SV1; QQDownload 732; .NET4.0C; .NET4.0E; SE 2.X MetaSr 1.0)"

maxthon浏览器
“Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Maxthon/4.4.3.4000 Chrome/30.0.1599.101 Safari/537.36"

UC浏览器
“Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 UBrowser/4.0.3214.0 Safari/537.36”

移动端

IPhone
“Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5”

IPod
“Mozilla/5.0 (iPod; U; CPU iPhone OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5”

IPAD
“Mozilla/5.0 (iPad; U; CPU OS 4_2_1 like Mac OS X; zh-cn) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148 Safari/6533.18.5”
“Mozilla/5.0 (iPad; U; CPU OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5”

Android
“Mozilla/5.0 (Linux; U; Android 2.2.1; zh-cn; HTC_Wildfire_A3333 Build/FRG83D) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1”
“Mozilla/5.0 (Linux; U; Android 2.3.7; en-us; Nexus One Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1”

QQ浏览器 Android版本
“MQQBrowser/26 Mozilla/5.0 (Linux; U; Android 2.3.7; zh-cn; MB200 Build/GRJ22; CyanogenMod-7) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1”

Android Opera Mobile
“Opera/9.80 (Android 2.3.4; Linux; Opera Mobi/build-1107180945; U; en-GB) Presto/2.8.149 Version/11.10”

Android Pad Moto Xoom
“Mozilla/5.0 (Linux; U; Android 3.0; en-us; Xoom Build/HRI39) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13”

BlackBerry
“Mozilla/5.0 (BlackBerry; U; BlackBerry 9800; en) AppleWebKit/534.1+ (KHTML, like Gecko) Version/6.0.0.337 Mobile Safari/534.1+”

WebOS HP Touchpad
“Mozilla/5.0 (hp-tablet; Linux; hpwOS/3.0.0; U; en-US) AppleWebKit/534.6 (KHTML, like Gecko) wOSBrowser/233.70 Safari/534.6 TouchPad/1.0”

Nokia N97
“Mozilla/5.0 (SymbianOS/9.4; Series60/5.0 NokiaN97-1/20.0.019; Profile/MIDP-2.1 Configuration/CLDC-1.1) AppleWebKit/525 (KHTML, like Gecko) BrowserNG/7.1.18124”

Windows Phone Mango
“Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Titan)”

UC浏览器
UCWEB7.0.2.37/28/999"

“NOKIA5700/ UCWEB7.0.2.37/28/999”

UCOpenwave
“Openwave/ UCWEB7.0.2.37/28/999”

UC Opera
“Mozilla/4.0 (compatible; MSIE 6.0; ) Opera/UCWEB7.0.2.37/28/999”

“Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1”,
“Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11”,
“Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6”,
“Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6”,
“Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1”,
“Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5”,
“Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.36 Safari/536.5”,
“Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3”,
“Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3”,
“Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3”,
“Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3”,
“Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3”,
“Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3”,
“Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3”,
“Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3”,
“Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3”,
“Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24”,
“Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24”

Xpath的使用

常用匹配规则

nodename选取此节点的所有子节点
/从当前节点选取直接子节点(不会取得子节点的子节点的内容)
//从当前节点选取子孙节点
.选取当前节点
…选取当前节点的父节点
@选取属性

//div/@class  #所有div节点的class属性的值
//div[@class=‘a’]  #所有class属性值为‘a’的div节点的内存地址,可通过列表索引提取
<li class="item-0"><a href="link1.html">first item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a>  #注意,这里内部换行了
</li>
//li[@class="item-0"]/a/text()   #Xpath表达式
#获取属性class值为"item-0"的li节点的直接子节点a中的文本内容
#['first item', 'fifth item']
<li class="item-0"><a href="link1.html">first item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a>   #注意,这里内部换行了
</li>
//li[@class="item-0"]//text()   #Xpath表达式
#获取属性class值为"item-0"的li节点的所有子孙节点中的文本内容
#[['first item', 'fifth item', '\n     ']]

具体代码流程是:
先对html字符串进行分析

html = etree.parse('./test.html', etree.HTMLParser())

然后对分析结果使用Xpath方法,打印结果

result = html.xpath('//li[@class="item-0"]//text()')
print(result)

etree的HTML方法、tostring方法、parse方法

利用etree.HTML(html),将html字符串转化为Element对象(<class ‘lxml.etree._Element’>)。Element对象具有xpath的方法,返回结果的列表,能够接受bytes类型的数据和str类型的数据
示例:
Element结构

<tag attrib >text</tag>tail
eg:
<span width="200px">标签内的文本</span>标签后的文本
html = etree.HTML(text) 
ret_list = html.xpath("xpath字符串")

etree的tostring方法可以将element对象转化为二进制类型(bytes类型),所以需要用encoding属性指定编码方法,然后使用同样的编码方法进行解码(decode方法)。
优点:tostring方法会使原来不规则的html字符串补全为规则的html字符串。

HtmlStr=etree.tostring(HtmlElement,encoding="utf-8").decode()
print(HtmlStr)

encode()与decode()

stre=str.encode(encoding =‘UTF-8’,errors=‘strict’)
a=stre.decode(encoding=‘UTF-8’,errors=‘strict’) # a==str

      decode                 encode
str ---------> str(Unicode) ---------> str

参考

文献
[1]https://www.jianshu.com/p/e4a75cb6f268
[2]https://blog.csdn.net/jiangshangchunjiezi/article/details/88583985
[3]https://blog.csdn.net/jiangshangchunjiezi/article/details/76687168
[4]https://www.cnblogs.com/jackzz/p/10776129.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值