爬虫-Xpath语言和lxml类库

什么是XML

  • XML 指可扩展标记语言(EXtensible Markup Language)
  • XML 是一种标记语言,很类似 HTML
  • XML 的设计宗旨是传输数据,而非显示数据
  • XML 的标签需要我们自行定义。
  • XML 被设计为具有自我描述性。
  • XML 是 W3C 的推荐标准

W3School官方文档:http://www.w3school.com.cn/xml/index.asp

XML 和 HTML 的区别:

数据格式 描述 设计目标
XML Extensible Markup Language (可扩展标记语言) 被设计为传输和存储数据,其焦点是数据的内容。
HTML HyperText Markup Language (超文本标记语言) 显示数据以及如何更好显示数据。
HTML DOM Document Object Model for HTML (文档对象模型) 通过 HTML DOM,可以访问所有的 HTML 元素,连同它们所包含的文本和属性。可以对其中的内容进行修改和删除,同时也可以创建新的元素。

什么是XPath?

??XPath (XML Path Language) 是一门在 XML 文档中查找信息的语言,可用来在 XML 文档中对元素和属性进行遍历。
W3School官方文档:http://www.w3school.com.cn/xpath/index.asp

XPath 开发工具

  • 开源的XPath表达式编辑工具:XMLQuire(XML格式文件可用)
  • Chrome插件 XPath Helper
  • Firefox插件 try XPath

语法

??XPath 使用路径表达式来选取 XML 文档中的节点或者节点集。这些路径表达式和我们在常规的电脑文件系统中看到的表达式非常相似。

选取节点

下面列出了最常用的路径表达式:

表达式 描述
nodename 选取此节点的所有子节点
/ 从根节点选取
// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
. 选取当前节点。
.. 选取当前节点的父节点。
@ 选取属性。

谓语(Predicates)

谓语用来查找某个特定的节点或者包含某个指定的值的节点,被嵌在方括号中。

路径表达式 结果
/bookstore/book[1] 选取属于 bookstore 子元素的第一个 book 元素。
bookstore/book[last()] 选取属于 bookstore 子元素的最后一个 book 元素。
/bookstore/book[last()-1] 选取属于 bookstore 子元素的倒数第二个 book 元素。
/bookstore/book[position()<3] 选取最前面的两个属于 bookstore 元素的子元素的 book 元素。
//title[@lang] 选取所有拥有名为 lang 的属性的 title 元素。
//title[@lang=’eng’] 选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。
/bookstore/book[price>35.00] 选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00。
/bookstore/book[price>35.00]/title 选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00。

选取未知节点

XPath 通配符可用来选取未知的 XML 元素。

通配符 描述
* 匹配任何元素节点。
@* 匹配任何属性节点。
node() 匹配任何类型的节点。

选取若干路径

通过在路径表达式中使用“|”运算符,您可以选取若干个路径。

路径表达式 结果
//book/title | //book/price 选取 book 元素的所有 title 和 price 元素。
//title | //price 选取文档中的所有 title 和 price 元素。
/bookstore/book/title | //price 选取属于 bookstore 元素的 book 元素的所有 title 元素,以及文档中所有的 price 元素。

这些就是XPath的语法内容,在运用到Python抓取时要先转换为xml。

lxml库

??lxml 是 一个HTML/XML的解析器,主要的功能是如何解析和提取 HTML/XML 数据。
??lxml和正则一样,也是用 C 实现的,是一款高性能的 Python HTML/XML 解析器,我们可以利用之前学习的XPath语法,来快速的定位特定元素以及节点信息。
??lxml python 官方文档:http://lxml.de/index.html
??需要安装C语言库,可使用 pip 安装:pip3 install lxml (或通过wheel方式安装)

解析HTML代码

# 使用 lxml 的 etree 库
from lxml import etree 

text = '''
<div>
    <ul>
         <li class="item-0"><a href="link1.html">first item</a></li>
         <li class="item-1"><a href="link2.html">second item</a></li>
         <li class="item-inactive"><a href="link3.html">third item</a></li>
         <li class="item-1"><a href="link4.html">fourth item</a></li>
         <li class="item-0"><a href="link5.html">fifth item</a> # 注意,此处缺少一个 </li> 闭合标签
     </ul>
 </div>
'''

#利用etree.HTML,将字符串解析为HTML文档,返回类型:<class 'lxml.etree._ElementTree'>
html = etree.HTML(text) 

# 按字符串序列化HTML文档
result = etree.tostring(html).decode("utf-8")
print(result)

lxml 可以自动修正 html 代码,例子里不仅补全了 li 标签,还添加了 body,html 标签。

文件读取

除了直接读取字符串,lxml还支持从文件里读取内容。新建一个html文件,再利用 etree.parse() 方法来读取文件。

from lxml import etree

# 读取外部文件,返回类型:<class 'lxml.etree._ElementTree'>
html = etree.parse('./hello.html')

result = etree.tostring(html, pretty_print=True)

print(result)

XPath实例

1 获取所有的 <li> 标签

from lxml import etree

html = etree.parse('hello.html')
print type(html)  # 显示etree.parse() 返回类型

result = html.xpath('//li')

print(result) # 打印<li>标签的元素集合
print(len(result))
print(type(result))
print(type(result[0]))

2 获取<li>标签的所有 class属性

html = etree.parse('hello.html')
result = html.xpath('//li/@class')

3 获取<li>标签下的所有 <span> 标签

#因为 / 是用来获取子元素的,而 <span> 并不是 <li> 的子元素,所以,要用双斜杠
result = html.xpath('//li//span')

4 获取 class 值为 bold 的标签名

result = html.xpath('//*[@class="bold"]')

# tag方法可以获取标签名
print result[0].tag

原文地址:https://www.cnblogs.com/shuai-long/p/9650208.html

时间: 2024-10-31 12:29:01

爬虫-Xpath语言和lxml类库的相关文章

Python爬虫利器三之Xpath语法与lxml库的用法

前面我们介绍了 BeautifulSoup 的用法,这个已经是非常强大的库了,不过还有一些比较流行的解析库,例如 lxml,使用的是 Xpath 语法,同样是效率比较高的解析方法.如果大家对 BeautifulSoup 使用不太习惯的话,可以尝试下 Xpath. 参考文档: lxml python 官方文档 XPath语法参考 w3school 安装 pip install lxml 利用 pip 安装即可 XPath语法 XPath 是一门在 XML 文档中查找信息的语言.XPath 可用来在

python爬虫xpath的语法

python爬虫xpath的语法 有朋友问我正则,,okey,其实我的正则也不好,但是python下xpath是相对较简单的 简单了解一下xpath: XPath 是一门在 XML 文档中查找信息的语言.XPath 可用来在 XML 文档中对元素和属性进行遍历. XPath 是 W3C XSLT 标准的主要元素,并且 XQuery 和 XPointer 都构建于 XPath 表达之上. 因此,对 XPath 的理解是很多高级 XML 应用的基础. 这个是w3c上关于xpath的介绍,可以看出xp

使用HTML语言和CSS开发商业站点(9)

#div_1 dl{ margin:0px;/*dl默认有外边距 跟ul一样*/ padding:0px; height:46px; margin-top:15px;} #div_1 dl dd{ margin:0px;/*dd默认有外边距*/ float:left; margin-left:10px; height:100%; line-height:46px; } 好的,使用HTML语言和CSS开发商业站点 就到这里结束    接下来是    使用Java实现面向对象编程 多多关注.评论,谢

C语言和OpenGL实现的24位色BMP解码器

我突然很喜欢发明轮子.. 早就想实现一下图片解码器和声音解码器. bmp的图片没有压缩,解码最简单,今天下午研究了一下bmp的编码,然后写了个24位色的解码器.(24位色的bmp没有调色板,8位和16位都有). 代码很简单,直接就能看懂,所以不说很多,直接贴了.. 1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include <stdio.h> 4 #include <Windows.h> 5 #include <gl/freeglut.h&g

C语言和PHP语法相异点

C语言和PHP语法相异点技术 maybe yes 发表于2015-02-05 16:09 原文链接 : http://blog.lmlphp.com/archives/80  来自 : LMLPHP后院 PHP 的语法规则和 C 语言语法规则非常的相似,PHP 中很多内部函数调用的就是原生的 C 语言函数.由于两种语言的运行方式不同,导致在某些情况下语法也有一些差异,下面列举几个. 获取全局变量方式不同 在作用域中获取全局变量的值,PHP 必须借助 global 关键字获取或者使用超全局变量 $

用Swift语言和Sprite Kit复制微信飞机大战游戏

先上GitHub链接: https://github.com/songrotek/PlaneWar.git 接下来稍微讲解一下! 这个程序还有点Bug,见谅! 1 说明 游戏采用了Sprite kit最新的Per pixel for physic 技术,就是直接使用texture纹理作为sprite的physics body . 游戏的texture.atlas从别的打飞机项目中拷之并辛苦地分解了. 游戏编写借鉴了网上的objc代码! 2 游戏编写过程 添加背景-> 添加控制的飞机-> 添加发

C语言和matlab

分别用C语言和matlab实现二分法查找数据 从形式上能够发现区别是,matlab是一句一句编译的,而c语言是对一个完整的代码段进行编译的,并且c中有头文件(#include(...)),而matlab中没有,对于数值运算matlab是很简便强大的,c就有点繁琐,对于算法要求c相对更高点. 具体例子如下: C语言 #define M 10 #include<stdio.h> void main(){ static int a[M]={-12,0,6,16,23,56,80,100,110,11

Go语言和ASP.NET的一般处理程序在处理WEB请求时的速度比较

Go语言和ASP.NET的一般处理程序在处理WEB请求时的速度比较 1.首先写一个Go语言的简单WEB程序,就返回一个HelloWord! package main import ( f "fmt" "log" "net/http" // "strings" ) func sayhelloName(w http.ResponseWriter, r *http.Request) { // r.ParseForm() // f.P

1000道C语言和C++语言的练习题及答案 #0000-0050

汇集1000道C语言和C++语言的练习题 (例题.笔试题.编程题.算法设计题),由我亲自配上答案(点此查看). 语法题我就不出了,那个没意思,看书就可以了. 本贴汇集50题 (0000-0050),持续更新... 0001. 抽签题 从10个数中随机抽取5个数.(相当于双色球抽签问题) 0002. 插入排序 已有10个按增序排列好的整数1,3,5,7,9,11,13,15,17,19.要求把一个整数n插到数组中,保持增序排列. 0003. 数学公式类计算题 已经圆柱体的底半径r,高h,求体积v.