Xpath详解

在上一篇文章中我们讲述了Beautiful Soup,这个模块我们一般使用她的文档搜索树去从爬取的网页中找到我们需要的东西,而且一般来讲我们都是使用她的CSS选择器去处理网页,所以其实需要一点CSS基础,本章我们讲XPath。

XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历。XPath 是 W3C XSLT 标准的主要元素,并且 XQuery 和 XPointer 都构建于 XPath 表达之上。因此,对 XPath 的理解是很多高级 XML 应用的基础。

XML与HTML的不同:

xml是用来存储和传输数据的,而HTML是用来显示数据的

html标签是固定的,xml标签是自定义的

xpath是在xml文档中查找指定元素的,他是一种路径表达式

一、安装

pip install lxml	

我们可以再浏览器安装一个插件,方便我们调试 XPath Helper 2.0.2,当然没必要非得是这个版本

二、简单使用

from lxml import etree
# 将HTML文档变成一个对象,然后调用对象的方法去查找指定的节点
# 1.本地文件
tree = etree.pare('')
# 2.网络文件
tree = etree.HTML(txt)

三、定位元素

3.1、节点
表达式描述
nodename选取此节点的所有子节点。
/从根节点选取(取子节点)。
//从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置(取子孙节点)。
.选取当前节点。
选取当前节点的父节点。
@选取属性。
3.2、谓语
路径表达式结果
/bookstore/book[1]选取属于 bookstore 子元素的第一个 book 元素。
/bookstore/book[last()]选取属于 bookstore 子元素的最后一个 book 元素。
/bookstore/book[last()-1]选取属于 bookstore 子元素的倒数第二个 book 元素。
/bookstore/book[position()< 3]选取最前面的两个属于 bookstore 元素的子元素的 book 元素。
//title[@lang]选取所有拥有名为 lang 的属性的 title 元素。
//title[@lang=‘eng’]选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。
/bookstore/book[price>35.00]选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00。
/bookstore/book[price>35.00]//title选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00。
3.3、运算符
运算符描述实例返回值
|计算两个节点集//book | //cd返回所有拥有 book 和 cd 元素的节点集
+加法6 + 410
-减法6 - 42
*乘法6 * 424
div除法8 div 42
=等于price=9.80如果 price 是 9.80,则返回 true。如果 price 是 9.90,则返回 false。
!=不等于price!=9.80如果 price 是 9.90,则返回 true。如果 price 是 9.80,则返回 false。
<小于price<9.80如果 price 是 9.00,则返回 true。如果 price 是 9.90,则返回 false。
<=小于或等于price<=9.80如果 price 是 9.00,则返回 true。如果 price 是 9.90,则返回 false。
>大于price>9.80如果 price 是 9.90,则返回 true。如果 price 是 9.80,则返回 false。
>=大于或等于price>=9.80如果 price 是 9.90,则返回 true。如果 price 是 9.70,则返回 false。
orprice=9.80 or price=9.70如果 price 是 9.80,则返回 true。如果 price 是 9.50,则返回 false。
andprice>9.00 and price<9.90如果 price 是 9.80,则返回 true。如果 price 是 8.50,则返回 false。
//input[@class='s_ipt' and @name='wd']
3.4、模糊匹配
3.4.1、contains
//input[contains(@class,'s')]

所有的input,有class属性,且class属性中有s的

3.4.2、starts-with
//input[starts-with(@class,'s')]

所有的input,有class属性,且class属性以s开头的

3.5、取文本
//div[@id='u']/a[1]/text()
//div[@id='u']//text()
3.6、取属性
//div[@id='u']/a[1]/@herf

其实这些我们必要去死记硬背,多写几次我们就发现很多常用的就会了,不常用了我们也用不到了

四、一个小例子

我们爬取笔趣阁的一本小说的目录

小说的URL https://www.bige7.com/book/67875/

import requests
from lxml import etree
# 下载下来这个页面
url = 'https://www.bige7.com/book/67875/'
res = requests.get(url=url).text
tree = etree.HTML(res)

# 找到连接的列表
href = tree.xpath('//div[@class="listmain"]//dd/a/@href')
# 找到文字的列表
text = tree.xpath('//div[@class="listmain"]//dd/a/text()')
temp = []

for i in range(len(href)):
    temp.append((href[i], text[i]))

with open('./a.txt','w') as f:
    f.write(str(temp))
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

LyaJpunov

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

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

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

打赏作者

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

抵扣说明:

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

余额充值