简介

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. .net core partial view的一些心得

    原文:.net core partial view的一些心得 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog. ...

  2. 浅析web网站反向代理的配置

    一.背景 最近在部署项目到web服务器上时,该项目有一个打开视频监控的功能,视频的服务器是一台内网的服务器,不允许设置外网端口访问,网站服务器和视频服务器在同一个局域网内,可以相互联通.网络拓扑图如下 ...

  3. ES6 Proise 简单理解

    Promise 这是ES6中增加的一个处理异步的对象. 传统变成写异步函数的时候,经常会遇到回调套回调: Promise 是异步编程的一种解决方案,比传统的解决方案 -----回调函数和事件----- ...

  4. ajax格式,转入后台

    setInterval(function(),时间)定时重复发送请求

  5. javaWeb文件上传与下载

    文件上传与下载在项目中运用的使用频率很大 今天也花时间整理了一下 多文件上传图片回显 和文件下载  1.多文件上传 这里会涉及到几个属性 fileSizeThreshold:缓冲区文件的大小 如果上传 ...

  6. 【Day5】3.反爬策略之模拟登录

    import urllib.request as ur import user_agent import lxml.etree as le request = ur.Request( url='htt ...

  7. NLP传统基础(3)---潜在语义分析LSA主题模型---SVD得到降维矩阵

    https://www.jianshu.com/p/9fe0a7004560 一.简单介绍 LSA和传统向量空间模型(vector space model)一样使用向量来表示词(terms)和文档(d ...

  8. sem_open 信号量操作

    sem_open,计算机用语.意思是创建并初始化有名信号量或打开一个已存在的有名信号量 sem_init:初始化信号量sem_t,初始化的时候可以指定信号量的初始值,以及是否可以在多进程间共享. se ...

  9. Lua 学习之基础篇六<Lua IO 库>

    引言 I/O 库提供了两套不同风格的文件处理接口. 第一种风格使用隐式的文件句柄: 它提供设置默认输入文件及默认输出文件的操作, 所有的输入输出操作都针对这些默认文件. 第二种风格使用显式的文件句柄. ...

  10. Codeforces Round #596 (Div. 2, based on Technocup 2020 Elimination Round 2) D. Power Products

    链接: https://codeforces.com/contest/1247/problem/D 题意: You are given n positive integers a1,-,an, and ...