我们获取了想要的html页面之后,接下来的问题就是如何将我们需要的数据给提取下来,一 般来说有三种方式,分别是Xpath语法,正则表达式和bs4库。
| 解析方式 | 解析速度 | 难度 |
| Xpath | 快 | 中等 |
| bs4 | 慢 | 容易 |
| re(正则表达式) | 最快 | 困难 |
Xpath(XML Path Language)是一门在XML和HTML文档中查找信息的语言, 可用来在XML和HTML文档中对元素和属性进行遍历。简单来说,我们的数据是超文本数据,想要获取超文本数据里面的内容,就要按照一定规则来进行数据的获取,这 种规则就叫做Xpath语法。
XPath 用于在 HTML 文档中通过元素【HTML标签】和属性【HTML标签的属性】进行数据的定位。
Xpath的环境配置安装:
通常安装在谷歌浏览器(chrome)环境下,可以百度搜索配置方法。
在Python中,为了使用XPath,需要安装一个第三方库:lxml。
Python 里面的lxml库只做了这样一件事:将html字符串进行解析,供Xpath语法进行数据提取。
在线安装:CMD下 pip install lxml
XPath语句格式:
核心思想:写XPath就是写地址。
获取文本:
//标签1[@属性1="属性值1"]/标签2[@属性2="属性值2"]/..../text()
获取属性值:
//标签1[@属性1="属性值1"]/标签2[@属性2="属性值2"]/..../@属性n
其中,[@属性="属性值"]不是必需的。它的作用是帮助过滤相同的标签。在不需要过滤相同标签的情况下可以省略。
XPath语法:
| 表达式 | 描述 | 用法 | 说明 |
| nodenane | 选取此节点的所有子节点 | div | 选取div下的所有标签 |
| // | 从全局节点中选择节点,任意位置均可 | //div | 选取整个HEML页面的所有div标签 |
| / | 选取某个节点下的节点 | //head/title | 选取head标签下的title标签 |
| @ | 选取带某个属性的节点 | //div[@id] | 选择带有id属性的div标签 |
| . | 当前节点下 | ./span | 选择当前节点下的span标签 |
| * | 匹配任意节点 | //div[@id='u1']/* | 选择所有拥有id=u1的div标签下的所有节点 |
| @* | 匹配节点中的任何属性 | //meta[@*] //a[@*] | 选择所有拥有属性的meta标签 选择所有拥有属性的a标签 |
注意:Xpath提取数据返回的结果是列表,后续操作需要使用列表操作
| 表达式 | 用法说明 |
| //head/meta[1] //head/neta[k] | 选择所有head下的第一个meta标签 选择所有head下的第k个meta标签 |
| //head/meta[last()] | 选择所有head下的最后一个meta标签 |
| //head/meta[postion()<3] | 选择所有head下的前两个meta标签 |
| //div[@id] | 选择带有id属性的div标签 |
| //div[@id='u1'] | 选择所有拥有id=u1的div标签 |
| //meta | //title | 选择所有的meta和title |
XPath的特殊情况
(1)以相同字符串开头
在XPath中,属性以某些字符串开头,可以写为:
//标签[starts-with(@属性名, "相同的开头部分")]
<body>
<div id="test-1">需要的内容1</div>
<div id="test-2">需要的内容2</div>
<div id="testfault">需要的内容3</div>
<div id="useless">这是我不需要的内容</div>
</body>
//div[starts-with(@id, "test")]/text()
(2)属性值包含相同字符串
//标签[contains(@属性名, "相同的开头部分")]
(3)对XPath返回的对象执行XPath

可以通过下面的代码来获取需要的信息:
//div[@class="useful"]/ul/li/text()
同时,还可以先抓取useful标签,再对这个标签进一步执行XPath,获取里面子标签的文字。
useful = selector.xpath('//div[@class="useful"]') #这里返回一个列表
info_list = useful[0].xpath('ul/li/text()')
(4)不同标签下的文字
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
</head>
<body>
<div id="test3">
我左青龙,
<span id="tiger">
右白虎,
<ul>上朱雀,
<li>下玄武。</li>
</ul>
老牛在当中,
</span>
龙头在胸口。
</div>
</body>
</html>
data = selector.xpath('//div[@id="test3"]')[0]
info = data.xpath('string(.)')
本文介绍了Python网络爬虫中使用XPath提取数据的方法。XPath是一种在XML和HTML文档中查找信息的语言,用于通过元素和属性定位数据。文章详细讲解了XPath的环境配置、语句格式、语法及特殊情况,强调XPath返回结果为列表,需用列表操作处理。还提到了XPath在Python中的应用,使用lxml库进行解析和数据提取。
1211

被折叠的 条评论
为什么被折叠?



