查看原文
其他

xpath选择器

stormdony Python绿洲 2018-08-21

阅读文本需要2分钟

在上一篇scrapy实战中,用到了xpath来定位元素。现在虽然我们可以通过在浏览器的开发者模式下直接定位得到元素的xpath路径,但是有时候获得的路径不是那么的简洁,所以需要我们手动简化。
ps:这里只讲述元素定位相关的语法

Xpath简介

XPath即为XML路径语言,它是一种用来确定XML(标准通用标记语言的子集)文档中某部分位置的语言。XPath基于XML的树状结构,有不同类型的节点,包括元素节点,属性节点和文本节点,提供在数据结构树中找寻节点的能力。起初 XPath 的提出的初衷是将其作为一个通用的、介于XPointer与XSLT间的语法模型。但是 XPath 很快的被开发者采用来当作小型查询语言。

简单点,就是我们通过Xpath可以获取XML中的指定元素和指定节点的值。在爬虫中我们获取的HTML数据通过XPath解析,获取我们想要的结果。

路径表达式

Xpath使用路径表达式在XML文档中选取节点。节点是通过沿着路径来选取的,通过路径可以找到我们想要的节点或者节点范围。

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

只说不练,假把式。所以将以下面的代码来举个栗子:

1<html lang="en">
2    <head>
3        <meta charset="UTF-8">
4        <title>Login</title>    
5    </head>
6    <body>
7        <div class="all">
8            <div class="user">
9                <form action="" method="post">
10                    <input type="button" name="signIn" class="btn" value="sign in">
11                </form>
12            </div>
13        </div>
14    </body>
15</html>

1.绝对路径:

1response.xpath('html/body/div/div')

这样就可以一层一层的定位到class="user"<div>

2.相对路径:

1response.xpath('//form/input')

两个斜杠表示相对路径,这样可以大大的提高效率

3.属性定位:

1response.xpath('//div[@class="user"]')

这里使用属性定位,快速定位到class="user"这个<div>

拓展语法

在爬取网站信息的时候,经常会遇到下面的两种情况:

1. 获取不在标签里的文字

1<span>
2    <li>hello</li>
3    world
4</span>

如果需要获取文本信息world,单纯的运用上面的方法,很难获得。

但是可以通过following来获得

1response.xpath('li/following::text()')

2.获取包含某一关键字的元素

例如获取下一页的链接:

1<a href="http://www.baidu.com" class="n">下一页</a>

可以通过使用contains来获取链接

1response.xpath('//div/a[contains(text(),"下一页")]/@href')

写在最后

xpath选择器在爬虫项目中,经常会使用到,上面的几种基本用法能够应对大部分情况。当然,还有更快速的选择器,下篇文章将会讲述CSS选择器的用法,敬请期待!!!

如果有什么问题可以向我提问哦

点赞是一种美德



    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存