博客
关于我
python爬虫:scrapy框架xpath和css选择器语法
阅读量:798 次
发布时间:2023-04-02

本文共 3544 字,大约阅读时间需要 11 分钟。

Xpath和CSS选择器入门教程

Xpath基础语法

Xpath是一种强大的用于XML和HTML文档检索的语言,它允许开发者通过路径表达式准确地定位到指定节点。以下是Xpath的基本语法和常用表达式。

常用路径表达式

表达式 描述 示例
nodename 选取nodename节点的所有子节点 //div
/ 选取根节点 /div
// 选取所有节点,不考虑位置 //div
. 选取当前节点 ./div
.. 选取当前节点的父节点 ..
@ 选取属性 //@class

元素标签定位

表达式 描述 示例
articl 选取所有articl元素的子节点 articl
/artical 选取根元素artical /artical
./artical 选取当前元素下的articl ./artical
../artical 选取父元素下的articl ../artical
articl/a 选取所有articl的a子元素 articl/a
//div 选取所有div子元素,无论位置在哪里 //div
articl//div 选取所有articl下的div元素 articl//div
//@class 选取所有拥有指定class属性的div节点 //@class
a/@href 选取a标签的href属性值 a/@href
a/text() 选取a标签下的文本 a/text()
string(.) 解析当前节点下所有文字 string(.)
string(..) 解析父节点下所有文字 string(..)

谓语

Xpath中的谓语用于筛选满足特定条件的节点,常见用法如下:

表达式 描述 示例
/artical/div[1] 选取articl下的第一个div元素 /artical/div[1]
/artical/div[last()] 选取articl下的最后一个div元素 /artical/div[last()]
/artical/div[last()-1] 选取articl下的倒数第二个div元素 /artical/div[last()-1]
/artical/div[position()<3] 选取articl下的前两个div元素 /artical/div[position()<3]
//div[@class] 选取所有拥有class属性的div节点 //div[@class]
//div[@class="main"] 选取所有class为main的div节点 //div[@class="main"]
//div[price>3.5] 选取价格大于3.5的div节点 //div[price>3.5]

通配符

Xpath通过通配符来定位未知的或结构不固定的XML元素,常见表达式如下:

表达式 描述 示例
//* 选取所有元素 //*
//div/* 选取div元素的所有子节点 //div/*
//div[@*] 选取所有带属性的div元素 //div[@*]

取多个路径

使用“|”运算符可以同时指定多个路径,返回多个节点的结果:

表达式 描述 示例
//div table 选取所有div和table节点 //div table
//div/a //div/p 选取div下的a和p元素 //div/a //div/p
articl/div/pl //span 选取div下的pl和所有span节点 articl/div/pl //span

Xpath轴

Xpath的轴用于定义相对于当前节点的节点集,常见用法如下:

轴名称 表达式 描述
ancestor ./ancestor::* 选取当前节点的所有先辈节点
ancestor-or-self ./ancestor-or-self::* 选取当前节点的所有先辈节点及节点本身
descendant ./descendant::* 选取当前节点的所有后代节点
child ./child::* 选取当前节点的所有子节点
parent ./parent::* 选取当前节点的父节点
following ./following::* 选取当前节点结束标签后的所有节点
following-sibling ./following-sibling::* 选取当前节点之后的兄弟节点
preceding ./preceding::* 选取当前节点开始标签前的所有节点
preceding-sibling ./preceding-sibling::* 选取当前节点之前的兄弟节点
self ./self::* 选取当前节点
attribute ./attribute::* 选取当前节点的所有属性

功能函数

Xpath的功能函数可以增强查询的灵活性,常见用法如下:

功能函数 用法 描述
starts-with //div[starts-with(@id,"ma")] 选取id值以ma开头的div节点
contains //div[contains(@id,"ma")] 选取所有id值包含ma的div节点
and //div[contains(@id,"ma") and contains(@id,"in")] 选取id值同时包含ma和in的div节点
text() //div[contains(text(),"ma")] 选取节点文本包含ma的div节点
string() string(.) 解析当前节点下所有文字

注意事项

  • Xpath的准确性依赖于网页源码的结构,建议手动审查元素
  • 使用浏览器自带的开发工具(如Firebug插件)辅助获取Xpath
  • 结合属性查找时,使用属性选择符[@属性名]更为准确
  • 功能函数的使用可以显著提升Xpath的灵活性,但需谨慎使用
  • CSS选择器语法

    CSS选择器是一种轻量级的节点定位语言,常用于现代网页开发,以下是CSS选择器的基本语法和实用示例。

    选择器 描述 示例
    * 选择所有节点 *
    #container 选择id为container的节点 #container
    .container 选择所有class为container的节点 .container
    div, p 选择所有div和p节点 div, p
    li a 选择所有li下的a节点 li a
    ul + p 选择ul后面的第一个p节点 ul + p
    div#container > ul 选择div中id为container的节点的第一个ul子节点 div#container > ul
    ul ~ p 选择与ul相邻的所有p节点 ul ~ p
    a[title] 选择所有有title属性的a节点 a[title]
    a[href="http://baidu.com"] 选择所有href属性为http://baidu.com的a节点 a[href="http://baidu.com"]
    a[href*="baidu"] 选择所有href属性中包含baidu的a节点 a[href*="baidu"]
    a[href^="http"] 选择所有href属性以http开头的a节点 a[href^="http"]
    a[href$=".jpg"] 选择所有href属性以.jpg结尾的a节点 a[href$=".jpg"]
    input[type=radio]:checked 选择所有选中的radio节点 input[type=radio]:checked
    div:not(#container) 选择所有不具有id为container的div节点 div:not(#container)
    li:nth-child(3) 选择第三个li节点 li:nth-child(3)
    li:nth-child(2n) 选择所有偶数个li节点 li:nth-child(2n)
    a::attr(href) 选取a标签的href属性 a::attr(href)
    a::text 选取a标签下的文本 a::text

    提取内容

    方法 返回值 描述
    Selector.xpath() SelectorList对象 返回匹配结果列表
    Selector.css() SelectorList对象 返回CSS选择器匹配结果列表
    SelectorList.extract() List对象 提取匹配结果列表中的所有节点
    SelectorList.extract_first(default) String对象 提取匹配结果列表中的第一个节点,支持默认值

    通过合理运用Xpath和CSS选择器,可以高效地提取网页中的结构化数据,满足各种开发需求。

    转载地址:http://uqefk.baihongyu.com/

    你可能感兴趣的文章
    OSS直传与UXCore-Uploader实践
    查看>>
    Spring详解Bean的生命周期
    查看>>
    OS模块
    查看>>
    OS第1章
    查看>>
    OS第2章 —— 进程
    查看>>
    OS第3章 —— 进程调度和死锁
    查看>>
    OS第5章
    查看>>
    OS第6章 —— 设备管理
    查看>>
    OTA测试
    查看>>
    Other User's Bloh Links
    查看>>
    others
    查看>>
    Oulipo
    查看>>
    Outlook 2010 Inside Out
    查看>>
    outlook 2016 接收发送无法及时收下邮件,如何更改接收时间?
    查看>>
    Outlook Express could not be started
    查看>>
    outlook express 故障
    查看>>
    outlook gmail setting
    查看>>
    spring自定义线程池 逻辑 配置 ThreadPoolTaskExecutor corePoolSize maxPoolSize queueCapacity rejectedExecutionHa
    查看>>
    Outlookbar-style menu interface
    查看>>
    outlook中XXX.xls附件无法打开解决办法
    查看>>