1. 什么是XPath
- 解析XML的一种语言(HTML是XML的子级),广泛用于解析HTML数据。
- 几乎所有的语言都能使用XPath,如Java和C语言。
- 除了XPath还有其他手段解析XML,比如BeautifulSoup(py),lxml(py),DOM(java,js),SAX(java),JSDOM(js),DOM4J,minixml等。
2. 为啥使用XPath
- 元素没有id,name,class等明显或者唯一属性。
- 元素id是动态的(刷新以后会变化)。
- 通过元素定位工具抓取不到。
- 复制的XPath不稳定,当页面的源码发生更改的时候,复制的XPath也会发生变化。或者说,元素本身没有变化,但是其他元素修改导致该元素定位失败。
3. XPath语法
- 层级:
/
直接子集,//
跳级(2层,3层,4层……等这种) - 任意元素:
*
-->//*
表示页面中的任意一个节点。 - 属性:
@
属性访问(一般在节点上都有属性)//*[@class="属性值"]
- 节点:
.
当前节点;..
父级节点(表示返回上一级)
例子:
根据上面的图,这个表达式从【新西兰】> 【div class=“hide_box”】>【div class=“head_city”】>【div class=“ndwz”】>【span class=“city”】>【div class=“hide_box”】>【a 斐济】//*[text()="新西兰"]/../../div/span[2]/div/a[3](括号中的数字表示第几个)
- 函数:
text()
: 精确查询,标签内或者节点内的文字。但是如果文本后面有空格等特殊符号,则有可能通过这个方法无法找到。//*[text()="文本值"]
contains()
:模糊查询,检测某一个属性并不是完全等于某一个值,只是包含关系//*[contains(text(), "文本值")] //*[contains(@class, "baidu")]
starts-with()
:如果在查找的内容前面部分确定。支持文本和属性。//*[starts-with(@name, "ref")] //*[starts-with(text(), "搜索")]
and
:多个条件进行搜索。//*[@class='baidu' and @name='ref']
- 特殊
svg
的定位://*[name()='svg']
参考视频:
- 【Baby!还有定位不到的元素吗?无处安放的 Xpath(下集)-哔哩哔哩】 https://b23.tv/If7SzmZ
- 【智源学院】20分钟带你搞懂XPath — Scrapy数据解析神器-哔哩哔哩】 https://b23.tv/1G6BtO3