show | version | enable_checker |
---|---|---|
step |
1.0 |
true |
- 这次深入了 xpath 中的元素选择
- 可以根据元素层级关系选择
- 也可以根据元素位置选择
- 还可以根据属性具体值选择
- 而且可以根据文本的值进行选择
- 甚至开始使用通配符
- xpath 是整个爬取的核心
- 有什么东西可以练习么?🤔
- 感谢 Miloslav Nic 提供的学习资源
- 根下的AAA下的DDD下的BBB
- 任意层级下的DDD下的BBB
- 根下的AAA下的CCC下的DDD下的任意元素
- 根下的任意元素下的任意元素下的任意元素下的BBB
- 任意层级下的任意元素
- 使用谓词进行筛选
- 第一个元素
- 或最后一个元素
- 任意路径下的有id属性的BBB元素
- 任意路径下的
- 有id属性值为b1的
- BBB元素
- 有id属性值为b1的
- normalize-space
- 可将属性值开头和结尾的空格去掉
- 任意路径下的
- 有两个BBB子元素的
- 任意元素
- 任意路径下的
- 有任意两个元素的
- 任意元素
- 其实/child:AAA 就是/AAA
- child:一般可省略
- 子节点的子节点不是子节点
- 但属于后代节点
- descendant
- [dɪˈsendənt]
- child 直接子节点
- decendant 后代节点
- 经过验证
- //CCC/descendant::*
- 就是//CCC//*
- //CCC/descendant::DDD
- 就是//CCC//DDD
- //CCC/descendant::*
- 所以
- /descendant::就是//
- /child::就是/
- child是直属子节点
- parent是直属父节点
- 经过验证
- /parent::*
- 就是..
- //DDD/parent::*
- 就是//DDD/..
- /parent::*
- ancestor 和 parent
- ancestor 是历代祖先
- parent 是直接父母
- 同一级别下的后续节点
- 弟弟
- following-sibling::
- [ˈsɪblɪŋ]
- 同一级别下的前面的节点
- 哥哥
- preceding-sibling::
- [prɪˈsiːdɪŋ]
- 在选中节点之后的所有节点
- 后续
- 包括他的弟弟节点和弟弟节点的所有子节点
- sibling[ˈsɪblɪŋ]
- 不但是同级的弟弟节点
- 就连上一辈甚至更上辈分中排名靠后的所有分支都算数
- 这就是后续
- following::
- 不包含祖先节点
- 在选中节点之前的所有节点
- 前辈
- 包括他的哥哥节点和哥哥节点的所有子节点
- 不但是同级的哥哥
- 就连上一辈设置更上备份中排名靠前的所有分支都算数
- 这就是前辈
- preceding::
- 不包含祖先节点
- preceding包括所有之前的分支节点
- flollowing包括所有之后的分支节点
- 除了 自身和所有后代之外
- 要么之前
- 要么之后
- 自身和所有后代
- 怎么表示呢?
- 自己和所有后代
- 包括自身节点
- 也包括所有后代节点
- 包括自身节点
- 也包括所有后代节点
- descendant-or-self::
- 这次深入了 xpath 中的元素选择
- 直接选择
- /html
- /child::html
- /child::html/child::body
- 任意后代
- //div
- /descendant::div
- 任意元素
- //div/*
- 通过排行选择
- /span[1]
- /div[last()]
- /h1[first()]
- 属性选择
- //div[@*]
- //div[not(@*)]
- //a[@href]
- 属性值选择
- //a[@class='style1']
- 去冗余空格
- //div[normalize-space(@id)='mydiv']
- 子节点计数
- //*[count(a)=2]
- //div[count(a)<3]
- //div[count(*)>5]
- 标签名开始于
- //*[start-with(name(),'page')]
- //*[start-with(name(),'p')]
- //div[start-with(name(),'p')]
- 标签名包含
- //*[contains(name(),'note')
- //div[contains(name(),'note')
- 长度
- //*[string-length(name())>3]
- 并集
- //div|//span
- 直接父亲
- //h1/parent::*
- //h2/parent::div
- //h2/..
- 祖先
- //a[@id='link']/ancestor::*
- 弟弟
- //h1[@id='关羽']/following-siblings::*
- 哥哥
- //h3[@id='张飞']/preceding-siblings::*
- 后续
- //span[@id='刘备']/following::*
- 尊长
- //span[@id='关索']/preceding::*
- 自身和所有后代
- //span[@id='诸葛瞻']/decendant-or-self::*
- 直接选择
- xpath 是
- 整个爬取的核心
- 如果我只想爬取文本
- 而且是跨元素地爬取文本
- 有什么技巧么?🤔
- 下次再说