Python的Xpath

在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

lxml支持Xpath解析方式,这里是用的lxml.安装库lxml的方法可以见之前的笔记:龟速学爬虫笔记④龟速学爬虫笔记④

安装好之后需要实例化一个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节点,

那么就有以下三种方法可以实现:

  1. 从上往下顺序查找

  1. 跳跃了一个节点来找到这个div节点的对象

  1. 跳跃上面所有节点寻找

#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()即可。

获取属性的话直接用@属性名就好啦

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜之王。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值