文章目录

  • XPath选择器
  • 基础语法
  • /:描述一个从根开始的绝对路径
  • E1/E2: 选中E1子节点中的所有E2节点
  • //E: 选中文档中的所有E,无论在什么位置
  • E1//E2: 选中E1后代节点中的所有E2节点,无论在后代中的什么位置
  • E/text(): 选中E节点的文本
  • E/*: 选中E的所有元素子节点
  • */E: 选中孙节点中的所有E节点
  • E/@ATTR : 选中E节点中的ATTR属性值
  • //@ATTR : 选中文档中所有ATTR属性
  • E/@*: 选中E节点的所有属性值
  • . : 选中当前节点,用来描述相对路径
  • . . : 选中当前节点的父节点,用来描述相对路径
  • node[谓语] : 谓语用来查找某个特定的节点或者包含某个特定值的节点
  • 常用函数
  • string(arg): 返回参数的字符串值,包括子孙节点
  • contains(str1, str2): 判断str1中是否包含str2,返回布尔值

XPath选择器

XPath即XML路径语言,它是一种用来确定xml文档中某个部分位置的语言

基础语法

下面通过一个HTML文档讲解各个语法

from scrapy.selector import Selector
from scrapy.http import HtmlResponsebody = """
<html><head><base href = "http://www.baidu.com" /><title>User23333</title></head><body><h1>Hello World</h1><h1>Hello Scrapy</h1><b>Hello Python</b><ul><li>Python学习手册<b>价格:99.00元</b></li><li>Python核心编程<b>价格:88.00元</b></li><li>Python基础教程<b>价格:80.00元</b></li></ul> <div id = "images"><a href = "image1.html">Name: Iamge 1</br><img src = "image1.jpg"/></a><a href = "image2.html">Name: Iamge 2</br><img src = "image2.jpg"/></a><a href = "image3.html">Name: Iamge 3</br><img src = "image3.jpg"/></a><a href = "image4.html">Name: Iamge 4</br><img src = "image4.jpg"/></a><a href = "image5.html">Name: Iamge 5</br><img src = "image5.jpg"/></a></div> <ul class="pager">          <li class="current">Page 1 of 50</li>            <li class="next"><a href="catalogue/page-2.html" class="">next</a></li>         </ul>     </body>
</html>
"""response = HtmlResponse(url="http://www.example.com", body=body, encoding='utf-8')

/:描述一个从根开始的绝对路径

print(response.xpath('/html'))
print(response.xpath('/html/head'))

E1/E2: 选中E1子节点中的所有E2节点

print(response.xpath('/html/body/div/a')) #选中div子节点中的多有a 节点

//E: 选中文档中的所有E,无论在什么位置

print(response.xpath('//a')) #选中文档中的所有a

E1//E2: 选中E1后代节点中的所有E2节点,无论在后代中的什么位置

print(response.xpath('/html/body//img')) # 选中body后代中的所有img

E/text(): 选中E节点的文本

sel = response.xpath('//a/text()') # 选中所有a 的文本
print(sel)
print(sel.extract())

E/*: 选中E的所有元素子节点

print(response.xpath('/html/*')) # 选中html的所有子节点
print(response.xpath('/html/body/div//*')) # 选中div的所有后代元素节点

*/E: 选中孙节点中的所有E节点

print(response.xpath('//div/*/img'))

E/@ATTR : 选中E节点中的ATTR属性值

print(response.xpath('//img/@src')) # 选中img节点的src属性值

//@ATTR : 选中文档中所有ATTR属性

print(response.xpath('//@href')) # 选中所欲的href属性的值

E/@*: 选中E节点的所有属性值

print(response.xpath('//a[1]/img/@*')) # 获取第一个a下img的所有属性(这里只有src一个属性)

. : 选中当前节点,用来描述相对路径

sel2 = response.xpath('//a')[0] # 获取第一个a 的选择器对象
print(sel2)'''
假设我们想选中当前这个a 后代中的所有img,下面的做法是错误的,会找到文档中所有的img
因为//img是绝对路径,会从文档的根开始搜索,而不是从当前的a 开始
'''
print(sel2.xpath('//img')) #错误#需要使用.//img来描述当前节点后代中的所有img
print(sel2.xpath('.//img'))

. . : 选中当前节点的父节点,用来描述相对路径

print(response.xpath('//img/..')) # 选中所有img的父节点

node[谓语] : 谓语用来查找某个特定的节点或者包含某个特定值的节点

print(response.xpath('//a[3]')) # 选中多有a 中的第3个
print(response.xpath('//a[last()]'))
print(response.xpath('//a[position()<=3]'))# 选中所有含有id属性的div节点
print(response.xpath('//div[@id]'))# 选中所有含有id属性且值诶images的div
print(response.xpath('//div[@id="images"]'))

常用函数

string(arg): 返回参数的字符串值,包括子孙节点

text = '<a href = "#">Click here to go the<strong>Next Page</strong></a>'
selector = Selector(text=text)
# print(selector)# 以下做法得到相同结果
print(selector.xpath('/html/body/a/strong/text()').extract())
print(selector.xpath('string(/html/body/a/strong)').extract())# 如果想得到a 中的整个字符串‘Click here to go the Next Page’
# 使用text()就不行了,因为Click here to go the 和 Next Page在不同元素下
# 以下做法得到两个子串
print(selector.xpath('/html/body/a//text()').extract())
# 这种情况下可以使用string()函数
print(selector.xpath('string(/html/body/a)').extract())

contains(str1, str2): 判断str1中是否包含str2,返回布尔值

text2 = '''<div><p class="small info">hello world</p><p class="normal info">hello scrapy</p></div>
'''selector2 = Selector(text = text2)
print(selector2.xpath('//p[contains(@class, "small")]')) # 选择class属性中包含“small”的p元素
print(selector2.xpath('//p[contains(@class, "info")]')) # 选择class属性中包含“info”的p元素

Scrapy_XPath选择器相关推荐

  1. CSS 选择器:BeautifulSoup4解析器

    和 lxml 一样,Beautiful Soup 也是一个HTML/XML的解析器,主要的功能也是如何解析和提取 HTML/XML 数据. lxml 只会局部遍历,而Beautiful Soup 是基 ...

  2. xpath选择器简介及如何使用

    xpath选择器简介及如何使用 一.总结 一句话总结:XPath 的全称是 XML Path Language,即 XML 路径语言,它是一种在结构化文档(比如 XML 和 HTML 文档)中定位信息 ...

  3. css选择器及float(浮动)

    --------------------------选择器( css有就近原则)------------------------------- 选择器名称                 在css表的 ...

  4. html5类选择器选择权重,Python Html5和CSS3的新增功能:CSS权重与CSS3新增选择器

    一.CSS权重概念 CSS权重概念:指的是样式的优先级,有两条或多条样式作用于一个元素,权重高的那条样式对元素起作用,权重相同的,后写的样式会覆盖前面写的样式. 二.权重的等级 2.1.权重的等级划分 ...

  5. 浅谈对html css的理解,HTML+CSS入门 CSS选择器 、属性和值浅谈

    body { font-size: 0.8em; color: navy; } 上面的意思是为body选择器设置font-size字体大小和color字体颜色. 所以基本的,当它作用与HTML页面时, ...

  6. php表单偶数变颜色,利用CSS3 nth-child()选择器 实现表格奇偶行变色

    nth-child()简介 CSS3的nth-child() 选择器,我之前很少用,在做表格偶数行变色的时候,我通常在绑定的时候,做一个js判断,来加一个css,从而使表格偶数行和奇数行颜色不一样.这 ...

  7. FPGA(3)验证数字逻辑(与门、与非门、二选一数据选择器、2-4译码器、半加器、全加器)

    目录 一.验证与门 二.验证与非门 三.验证二选一数据选择器 四.验证2-4译码器 五.验证半加器 六.验证全加器 0.初始化定义 1.第一个半加器 2.第二个半加器 3.得到最终进位Co 代码 0决 ...

  8. 【代码笔记】Web-CSS-CSS id和Class选择器

    一,效果图. 二,代码. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...

  9. 任务二:1、选择器 2、连接集中状态的顺序 3、浮动的用发和原理 4、盒模型在IE和Google等不同浏览器的区别与联系...

    1.选择器类型 标签选择器,类选择器,ID选择器,组合选择器,伪类和伪元素,属性选择器,子选择器,同胞选择器, :not()选择器 1.同胞选择器 相邻同胞标签: h2 + p{ color:red; ...

最新文章

  1. 定义派生类拷贝构造函数
  2. mysql的count(*)的优化,获取千万级数据表的总行数
  3. Oracle osw监控工具的使用示例
  4. Windows2003如何安装IIS
  5. 关于CacheLookup一个有趣的问题
  6. .NET Core开发实战(第24课:文件提供程序:让你可以将文件放在任何地方)--学习笔记...
  7. python3调用c语言数组,使用Python中的ctypes访问数组
  8. LeetCode 764. 最大加号标志(DP)
  9. mysql 字符串搜_mysql – 在表中搜索字符串的SQL查询?
  10. tensorflow 模型可视化_基于tensorflow-2.x的yolov3实现
  11. 福大软工1816 · 第一次团队作业
  12. 专科计算机专业大学,计算机专业大学排名 专科生学计算机专业好吗
  13. Spark读写HBase(主要讲解SHC的使用)
  14. 骨龄测试软件app_测测app下载-工具包-测测下载v1.0.11 安卓版-西西软件下载
  15. 2021年阳江市高考成绩查询,阳江市召开2020年高考总结暨2021年新高考备考动员会...
  16. P1616 疯狂的采药+P1833 樱花+P1077 [NOIP2012 普及组] 摆花+P1064 [NOIP2006 提高组] 金明的预算方案
  17. sql server的缺陷 将截断字符串或二进制数据 哪个字段
  18. 【光模块单模和多模的区别及使用】
  19. VUE微信H5生成二维码海报保存在本地相册
  20. 《计算机网络》第三章课后答案第七版谢希仁

热门文章

  1. kibana 查询_干货 | Elasticsearch、Kibana数据导出实战
  2. Spring Batch 使用指南
  3. 如何在xshell中创建一个SSH隧道
  4. H3C认证无线高级工程师
  5. 软考网络工程师学习笔记6-无线通信网
  6. Java怎么去最高分最低分,深入java虚拟机:原子操作ParkEvent和Parker
  7. Java基础----JAVA语言的概述和开发环境的搭配
  8. 微信小程序,转盘抽奖
  9. flask+uwsgi+supervisor+nginx在局域网服务器上部署实践
  10. cpu高 load 高 内存高 io 高怎么排查