在python爬虫采集领域,会需要学习到正则表达式和Xpath表达式。这一篇笔记简单介绍一下Xpath相关的内容。
Xpath的概念
Xpath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力。起初XPath的提出的初衷是将其作为一个通用的、介于Xpointer与XSL间的语法模型。但是XPath很快地被开发者采用来当作小型查询语言。
XPath的选择功能十分强大,它提供了非常简明的路径选择表达式,另外,它还提供了超过100个内建函数,用于字符串、数值、时间的匹配以及节点、序列的处理等,几乎所有我们想要定位的节点,都可以用XPath来选择。
Xpath的解析原理是:
1.实现标签的定位:实例化一个etree的对象,且需要将被解析的页面源码数据加载到该对象中。
2.调用etree对象中的xpath方法结合着xpath表达式实现标签的定位和内容的捕获。
怎样才能在Python使用Xpath
安装好之后需要实例化一个etree对象,可以把你需要的源码数据加载到这里面
etree. parse(filepath)#文件路径
例如:
etree.parse('D:\111.txt')#实例化一个etree对象
Xpath表达式
选取节点 XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径或者 step 来选取的。
下面列出了最有用的路径表达式:
表达式 | 描述 |
nodename | 选取此节点的所有子节点。 |
/ | 从根节点选取。 |
// | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。 |
. | 选取当前节点。 |
.. | 选取当前节点的父节点。 |
@ | 选取属性。 |
在下面的表格中列出了一些路径表达式以及表达式的结果:
路径表达式 | 结果 |
bookstore | 选取 bookstore 元素的所有子节点。 |
/bookstore | 选取根元素 bookstore。 注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径! |
bookstore/book | 选取属于 bookstore 的子元素的所有 book 元素。 |
//book | 选取所有 book 子元素,而不管它们在文档中的位置。 |
bookstore//book | 选择属于 bookstore 元素的后代的所有 book 元素,而不管它们位于 bookstore 之下的什么位置。 |
//@lang | 选取名为 lang 的所有属性。 |
一个示例
假设有一个这样的HTML文档
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>test</title>
</head>
<body>
<div>
<p>喵喵</p>
</div>
<div class="cute">
<p>天使猫猫</p>
<p>巧克力猫</p>
<p>草莓猫猫</p>
<p>彩虹猫猫</p>
<a href="http://www.cute.com/" title="奇迹猫猫" target="_self">
我太可爱了,怎么办呢</a>
<a href="" class="cool">咖啡魔力猫</a>
</div>
<div class="ero">
<ul>
<li><a href="http://www.baidu.com" title="1">OUO</a></li>
<li><a href="http://www.4399.com" title="2">PWP</a></li>
<li><a href="http://www.7k7k.com" alt="3">QAQ</a></li>
<li><a href="http://www.4399h.com" class="4">喵呜</a></li>
<li><b>cute</b></li>
<li><i>cool</i></li>
<li><a href="http://www.hentaiba.com" id="6">喵喵</a></li>
</ul>
</div>
</body>
</html>
假设需要寻找的是:
<div>
<p>喵喵</p>
</div>
<div class="cute">
<p>天使猫猫</p>
<p>巧克力猫</p>
<p>草莓猫猫</p>
<p>彩虹猫猫</p>
<a href="http://www.cute.com/" title="奇迹猫猫" target="_self">
我太可爱了,怎么办呢</a>
<a href="" class="cool">咖啡魔力猫</a>
</div>
以及
<div class="ero">
<ul>
<li><a href="http://www.baidu.com" title="1">OUO</a></li>
<li><a href="http://www.4399.com" title="2">PWP</a></li>
<li><a href="http://www.7k7k.com" alt="3">QAQ</a></li>
<li><a href="http://www.4399h.com" class="4">喵呜</a></li>
<li><b>cute</b></li>
<li><i>cool</i></li>
<li><a href="http://www.hentaiba.com" id="6">喵喵</a></li>
</ul>
</div>
以上三个该html文档所包含的全部div节点,
那么就有以下三种方法可以实现:
- 从上往下顺序查找
- 跳跃了一个节点来找到这个div节点的对象
- 跳跃上面所有节点寻找
#Xpath
etree.parse('D:\111.html')#实例化一个etree对象
#查找一个节点
tree=etree.parse('D:\111.html')
r1=tree.xpath('/html/body/div')
r2=tree.xpath('/html//div')
r3=tree.xpath('//div')
print(r1,r2,r3)
结果如下:
[<Element div at 0x3925128>, <Element div at 0x3925108>, <Element div at 0x3925088>] [<Element div at 0x3925128>, <Element div at 0x3925108>, <Element div at 0x3925088>] [<Element div at 0x3925128>, <Element div at 0x3925108>, <Element div at 0x3925088>]
当想要获取标签时,就要进行属性定位。
例如想要获取的是div中cute的标签<div class="cute">,那么类似地,可以这样进行:
r4=tree.xpath('//div[@class="cute"]')
print(r4)
返回某一类下的单独的标签,例如天使猫猫,则需要进行索引定位,可以这样:
r4=tree.xpath('//div[@class="cute"]/p[1]')
print(r4)
想要返回整个/p的列表的话,只需要:
r4=tree.xpath('//div[@class="cute"]/p')
print(r4)
需要注意的是,这里的顺序是从1开始,而不是从0开始。
以上返回的结果均是element,如果需要获取文本,就需要进行element到text()的转换:
r5=tree.xpath('//div[@class="ero"]/li[5]/b/text()')
print(r5)
['cute']#返回结果
这样可以直接返回字符串:
r5=tree.xpath('//div[@class="ero"]/li[5]/b/text()')[0]
print(r5)
直接返回标签li下所有文本,则只需要定位到//li并转换成text()即可。
获取属性的话直接用@属性名就好啦