简介
XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。
XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力。起初XPath的提出的初衷是将其作为一个通用的、介于XPointer与XSL间的语法模型。但是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)
彼岸图网图片爬取
注意:这里遇到中文乱码问题 解决方法一: # 处理中文乱码,将响应数据统一编码成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] # 处理中文乱码 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")
原文地址:https://www.cnblogs.com/songzhixue/p/11221919.html
时间: 2024-10-04 22:52:56