简介

XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。
XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力。起初XPath的提出的初衷是将其作为一个通用的、介于XPointerXSL间的语法模型。但是XPath很快的被开发者采用来当作小型查询语言

语法

选取节点 XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径或者 step 来选取的。 [1] 
下面列出了最有用的路径表达式:
表达式
描述
nodename
选取此节点的所有子节点。
/
从根节点选取。
//
从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
.
选取当前节点。
..
选取当前节点的父节点。
@
选取属性。

运算符

运算符
描述
实例
返回值
|
计算两个节点集
//book | //cd
返回所有拥有 book 和 cd 元素的节点集
+
加法
6 + 4
10
-
减法
6 - 4
2
*
乘法
6 * 4
24
div
除法
8 div 4
2
=
等于
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。
or
price=9.80 or price=9.70
如果 price 是 9.80,
或者 price 是 9.70,则返回 true。
and
price>9.00 and price<9.90
如果 price 大于 9.00,
并且 price 小于9.90,则返回 true。
mod
计算除法的余数
5 mod 2
1

常用表达式

- 获取所有节点
- 获取所有li标签
- //* //li
- 获取子节点
- 我们通过/或//即可查找元素的子节点和子孙节点
- li节点的所有直接a子节点
- //li/a
- 获取ul的所有子孙a节点
- //ul//a - 获取父节点属性
- 知道子节点查询父节点
- //div[@class="filter-wrap"]/../@class'
- //div[@class="filter-wrap"]/parent::*/@class' - 属性定位
- 找到当前源码中所有class属性为song的div标签
- //div[@class="song"] - 层级&索引定位
- 找到class属性值为tang的div的直系子标签ul下的第二个子标签li下的直系子标签a
- //div[@class="tang"]/ul/li[2]/a - 多属性匹配
- 从当前源码中找到href属性为空且class属性为song的所有a标签
- //a[@href="" and @class="song"] - 模糊匹配
- 找到所有class属性值中包含nb的所有div标签
- //div[contains(@class,"so")]
- 找到所有class属性值以zb开头的所有div标签
- //div[starts-with(@class,"ta")] - 获取文本
- / 表示获取某个标签下的文本内容
- // 表示获取某个标签下的文本内容和所有子标签下的文本内容
- //div[@class="song"]/p[1]/text()
- //div[@class="tang"]//text() - 获取属性
- //div[@class="tang"]//li[2]/a/@href

案例演示

环境安装

pip install lxml

解析原理

- 解析原理:
- 获取页面源码数据
- 实例化一个etree对象,并将页面源码数据加载到该对象中
- 调用该对象的xpath方法进行指定标签的定位
- 注意:xpath函数必须结合着xpath表达式进行标签的定位和内容的捕获

58同城房源信息抓取

import requests
from lxml import etree url = "https://bj.58.com/shahe/ershoufang/?PGTID=0d30000c-0047-e4b2-f57c-08960a90aab4&ClickID=1"
headres = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36'
}
response = requests.get(url).text # 实列化一个etree对象,加载页面源码数据
tree = etree.HTML(response) # etree对象调用xpath函数,结合xpath表达式进行标签定位和内容捕获
li_list = tree.xpath('//ul[@class="house-list-wrap"]/li') # 返回值由很多个li标签组成的列表
for i in li_list:
tetle = i.xpath("./div[2]/h2/a/text()")[0] # 局部调用表达式时必须加点
procr = "".join(i.xpath("./div[3]/p//text()")) # 将价格拼接
print(tetle,procr) """
i.xpath("./div[2]/h2/a/text() |./div[3]/h2/a/text()")[0]   # xpath中可以使用管道符表示或的关系,用这两种规则进行匹配
"""

彼岸图网图片爬取

注意:这里遇到中文乱码问题

解决方法一:
# 处理中文乱码,将响应数据统一编码成utf-8
# response.encoding = "utf-8" 解决方法二:
# 哪里乱码解码哪里
img_name.encode("iso-8859-1").decode("gbk")
import os
import urllib
import requests
from lxml import etree
url = "http://pic.netbian.com/4kmeinv/"
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36'
}
response = requests.get(url=url,headers=headers) # 处理中文乱码,将响应数据统一编码成utf-8
# response.encoding = "utf-8"
if not os.path.exists("./imgs"):
os.mkdir("./imgs")
page_text = response.text
# 实例化etree对象并加载页面源码数据
tree = etree.HTML(page_text)
# 找到所有li标签
li_list = tree.xpath("//div[@class='slist']/ul/li")
for li in li_list:
img_name = li.xpath("./a/b/text()")[0] # ./代表从li标签开始解析,不写m默认从整张HTML页面开始解析
# 处理中文乱码
img_name = img_name.encode("iso-8859-1").decode("gbk")
# 拼接图片路径
img_url = "http://pic.netbian.com" + li.xpath("./a/img/@src")[0]
img_path = "./imgs/" + img_name+".jpg"
# 调用urllib中的urlretrieve方法存储
urllib.request.urlretrieve(url=img_url,filename=img_path)
print("正在下载",img_name)
print("download ok")

 

爬虫之解析库Xpath的更多相关文章

  1. python爬虫三大解析库之XPath解析库通俗易懂详讲

    目录 使用XPath解析库 @(这里写自定义目录标题) 使用XPath解析库 1.简介   XPath(全称XML Path Languang),即XML路径语言,是一种在XML文档中查找信息的语言. ...

  2. 网页解析库-Xpath语法

    网页解析库 简介 除了正则表达式外,还有其他方便快捷的页面解析工具 如:lxml (xpath语法) bs4 pyquery等 Xpath 全称XML Path Language, 即XML路径语言, ...

  3. Python爬虫【解析库之beautifulsoup】

    解析库的安装 pip3 install beautifulsoup4 初始化 BeautifulSoup(str,"解析库") from bs4 import BeautifulS ...

  4. Python爬虫【解析库之pyquery】

    该库跟jQuery的使用方法基本一样  http://pyquery.readthedocs.io/ 官方文档 解析库的安装 pip3 install pyquery 初始化 1.字符串初始化 htm ...

  5. Python3编写网络爬虫05-基本解析库XPath的使用

    一.XPath 全称 XML Path Language 是一门在XML文档中 查找信息的语言 最初是用来搜寻XML文档的 但是它同样适用于HTML文档的搜索 XPath 的选择功能十分强大,它提供了 ...

  6. 爬虫解析库xpath

    # xpath简介 XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言.用于在 XML 文档中通过元素和属性进行导航. XPath基于XM ...

  7. python爬虫基础04-网页解析库xpath

    更简单高效的HTML数据提取-Xpath 本文地址:https://www.jianshu.com/p/90e4b83575e2 XPath 是一门在 XML 文档中查找信息的语言.XPath 用于在 ...

  8. python爬虫之解析库Beautiful Soup

    为何要用Beautiful Soup Beautiful Soup是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式, 是一个 ...

  9. python爬虫之解析库正则表达式

    上次说到了requests库的获取,然而这只是开始,你获取了网页的源代码,但是这并不是我们的目的,我们的目的是解析链接里面的信息,比如各种属性  @href  @class span  抑或是p节点里 ...

随机推荐

  1. (七)Activiti之历史活动查询和历史任务查询和流程状态查询

    一.历史活动查询 本章案例是基于上一章节案例的基础上,流程走完后进行测试的,也就是下图的流程从学生请假到班主任审批都已经完成,本章用来测试查询历史活动和历史任务的 activiti5的历史活动包括所有 ...

  2. Recastnavigation 创建 off-mesh link 的潜规则

    Recastnavigation 在创建off-mesh link 时,发现有的off-mesh link 无法寻路(虽然在地图上能看到off-mesh link 的连线   在Google Grou ...

  3. 使用私有api实现自己的iphone桌面,并根据app的使用次数对app排序

    使用<iphone SprintBoard部分私有API总结>中提到的api,除了能对app运行次数进行监控以外,还可以实现自己的iphone桌面,并根据app 的使用次数对app图标进行 ...

  4. MUI顶部导航布局

    一.头部 核心css mui-bar mui-bar-nav <header class="mui-bar mui-bar-nav"> <a class=&quo ...

  5. MySQL之字符函数

    MySql中提供一些函数对我们的开发有很多的帮助,下面就把MysQL提供的一些常用函数整理下,首先是字符处理函数: 1.CONCAT() 用法:字符串链接函数,将字符串字段连结在一块 举例: sele ...

  6. 成为一个高级java架构师所需要具备那些技能呢?

    一.什么是架构师 所谓架构师,思考的是全局的东西,是如何组织你的系统,以达到业务要求,性能要求,具备可扩展性(scalability),可拓展性(extendability),前后兼容性等.可能涉及到 ...

  7. 作为一个java高级工程师的进阶之路

    本文可能可能更偏向于是内心的独白篇和面试技巧总结 一.独白 之前也面试别人,现在轮到自己找工作,怎么说呢,每个面试官的看法不一样,面试的方式就不一样,比如我面试别人我喜欢问项目中他用到了那些,然后针对 ...

  8. nginx搭建反向代理服务器详解

    一.反向代理:Web服务器的“经纪人” 1.1 反向代理初印象 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从 ...

  9. libssh2--ssh2实例

    #include "libssh2_config.h"#include<libssh2.h>#include<libssh2_sftp.h> 上述为所包含必 ...

  10. 使用vs编写arduino项目

    说实话,arduino官方自带的编辑器有时候用的真不爽.所以直接使用vs开发arduino项目,用起来真爽,一直使用一直爽. 不多废话,直接上图,三部曲结束,搞定,收工. 我用的是vs2015版本的. ...