博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python爬虫笔记3-解析库Xpath的使用
阅读量:5947 次
发布时间:2019-06-19

本文共 4031 字,大约阅读时间需要 13 分钟。

当爬取到Html数据后,可以用正则对数据进行提取,但有时候正则表达式编写起来不方便,而且万一写错了,可能导致匹配失败。这时候就需要借助其他解析工具了。

XML引入

什么是XML?

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

W3School官方文档:

XML和HTML的区别

语法要求不同

  • 在html中不区分大小写,在xml中严格区分。
  • 在HTML中,有时不严格,如果上下文清楚地显示出段落或者列表键在何处结尾,那么你可以省略</p>或者</li>之类的结束标记。在XML中,是严格的树状结构,绝对不能省略掉结束标记。
  • 在XML中,拥有单个标记而没有匹配的结束标记的元素必须用一个/ 字符作为结尾。这样分析器就知道不用查找结束标记了。
  • 在XML中,属性值必须分装在引号中。在HTML中,引号是可用可不用的。
  • 在HTML中,可以拥有不带值的属性名。在XML中,所有的属性都必须带有相应的值。
  • 在XML文档中,空白部分不会被解析器自动删除;但是html是过滤掉空格的。

设计目标不同

  • XML被设计为传输和存储数据,其焦点是数据的内容。
  • HTML显示数据以及如何更好显示数据。

XML的节点关系

1、父(parent)

每个元素以及属性都有一个父。
下面是一个简单的XML例子中,book 元素是 title、author、year 以及 price 元素的父:

Harry Potter
J K. Rowling
2005
29.99

2、 子(Children)

元素节点可有零个、一个或多个子。
在下面的例子中,title、author、year 以及 price 元素都是 book 元素的子:

Harry Potter
J K. Rowling
2005
29.99

3、 同胞(Sibling)

拥有相同的父的节点
在下面的例子中,title、author、year 以及 price 元素都是同胞:

Harry Potter
J K. Rowling
2005
29.99

4、 先辈(Ancestor)

某节点的父、父的父,等等。
在下面的例子中,title 元素的先辈是 book 元素和 bookstore 元素:

Harry Potter
J K. Rowling
2005
29.99

5、 后代(Descendant)

某个节点的子,子的子,等等。
在下面的例子中,bookstore 的后代是 book、title、author、year 以及 price 元素:

Harry Potter
J K. Rowling
2005
29.99

Xpath

什么是Xpath?

Xpath,全称XML Path Language,即XML路径语言,它是一门在XML文档中查找信息的语言,可用来在 XML 文档中对元素和属性进行遍历。。最初是用来搜寻XML文档的,但是它也适用与HTML文档的搜索。

所以在做爬虫时,可以使用XPath来做相应的信息抽取。

W3School官方文档:

Xpath开发工具

  1. 开源的XPath表达式编辑工具:XMLQuire(XML格式文件可用)
  2. Chrome插件 XPath Helper
  3. Firefox插件 XPath Checker

使用Xpath

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

1、Xpath常用规则

表达式 描述
nodename 选取此节点的所有子节点
/ 从当前节点选取直接子节点
// 从当前节点选取子孙节点
. 选取当前节点
.. 选取当前节点的父节点
@ 选取属性

2、Xpath使用示例

以下面xmL文档为例:

Harry Potter
J K. Rowling
2005
29.99
路径表达式 结果
bookstore 选取bookstore元素的所有子节点
/bookstore 选取根元素bookstore。注:假如路径起始于正斜杠/,则此路径代表某元素的绝对路径
bookstore/book 选取属于bookstore的子元素的所有book元素
//book 选取所有book元素,不管在文档的任何位置
bookstore//book 选择属于 bookstore 元素的后代的所有 book 元素,而不管它们位于 bookstore 之下的什么位置。
//@lang 选取名为lang的所有属性

lxml库使用

lxml库安装

1、window安装

cmd进入命令行模式,执行

pip3 install lxml

2、ubuntu16.04安装

ctrl+alt+t进入终端模式,执行:

sudo apt-get install -y build-essential libssl-devl libffi-dev libxml2-dev libxslt1-dev zlib1g-dev

安装依赖的类库后,执行pip安装:

sudo pip3 install lxml

3、验证安装

导入lxml模块,如果没有报错就安装成功。

$ python3>>> import lxml

etree模块使用

初步使用

文件名lxml_test.py

# 使用 lxml 的 etree 库from lxml import etree text = '''
'''#利用etree.HTML,将字符串解析为HTML文档,etree模块可自动修正HTML文本html = etree.HTML(text) # 按字符串序列化HTML文档ret = etree.tostring(html) # torstring()方法返回的结果是bytes类型,这里用decode()方法将其转化为字符串print(ret.decode('utf-8'))

输出结果:

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

文件读取

除了直接读取字符串,lxml还支持从文件里读取内容。这里我将上面的lxml_test.py文件执行后的内容保存为test.html

python lxml_test.py >> test.html

内容就是上面的输出结果 cat test.html:

使用etree.parse()方法来读取文件。

from lxml import etreehtml = etree.parse('./test.html',HTMLParser())ret = etree.tostring(html)print(ret.decode('utf-8'))

输出结果

输出结果多了一个DOCTYPE声明,对解析结果没影响。

转载地址:http://mmbxx.baihongyu.com/

你可能感兴趣的文章
鸟哥的linux私房菜-shell简单学习-1
查看>>
nagios配置监控的一些思路和工作流程
查看>>
通讯组基本管理任务三
查看>>
赫夫曼编码实现
查看>>
html页面显示div源代码
查看>>
Centos下基于Hadoop安装Spark(分布式)
查看>>
3D地图的定时高亮和点击事件(基于echarts)
查看>>
接口由40秒到200ms优化记录
查看>>
java 视频播放 多人及时弹幕技术 代码生成器 websocket springmvc mybatis SSM
查看>>
Activiti6.0,spring5,SSM,工作流引擎,OA
查看>>
使用Tooltip会出现一个问题,如果行上出现复选框
查看>>
禁止浏览器缓存js
查看>>
【Redis】安装PHP的redis驱动(二)
查看>>
什么是序列化,为什么要序列化
查看>>
Java保留小数点后有效数字
查看>>
C++中一些类和数据结构的大小的总结
查看>>
mysql开启binlog
查看>>
ctrl + z fg bg
查看>>
工作流引擎Oozie(一):workflow
查看>>
struct框架
查看>>