XPath

1、什么是XPath

  XPath在Python的爬虫学习中,起着举足轻重的地位,对比正则表达式 re两者可以完成同样的工作,实现的功能也差不多,但XPath明显比re具有优势,在网页分析上使re退居二线。  

  XPath是什么? 全称为XML Path Language 一种小型的查询语言说道XPath是门语言。

2、为什么要使用XPath

  • Xpath的优点

  • 可在XML中查找信息

  • 支持HTML的查找

  • 通过元素和属性进行导航

3、怎么用XPath

xpaht更多方法
python开发使用XPath条件:
由于XPath属于lxml库模块,所以首先要安装库lxml。XPath的简单调用方法

from lxml import etree
# 将源码转化为能被XPath匹配的格式
selector=etree.HTML(源码) 

# 返回为一列表
selector.xpath(表达式)

4、XPath语法

1.选取节点

nodename     选取nodename节点的所有子节点         xpath(‘//div’)         选取了所有div节点
/            从根节点选取                        xpath(‘/div’)          从根节点上选取div节点
//           选取所有的当前节点,不考虑他们的位置    xpath(‘//div’)         选取所有的div节点
.            选取当前节点                        xpath(‘./div’)         选取当前节点下的div节点
..           选取当前节点的父节点                 xpath(‘..’)            回到上一个节点
@            选取属性                           xpath(’//@calss’)     选取所有的class属性


2.谓语

'''
表达式:                                    结果:
   xpath(‘/body/div[1]’)                     选取body下的第一个div节点
   xpath(‘/body/div[last()]’)                选取body下最后一个div节点
   xpath(‘/body/div[last()-1]’)              选取body下倒数第二个div节点
   xpath(‘/body/div[positon()<3]’)           选取body下前两个div节点
   xpath(‘/body/div[@class]’)                选取body下带有class属性的div节点
   xpath(‘/body/div[@class=”main”]’)         选取body下class属性为main的div节点  
   xpath(‘/body/div[price>35.00]’)           选取body下price元素值大于35的div节点

'''

ret=selector.xpath("//p[@class='story']//a[2]")
ret=selector.xpath("//p[@class='story']//a[last()]")

3.通配符

'''
通配符 Xpath通过通配符来选取未知的XML元素。

表达式:                结果:
  xpath(’/div/*’)        选取div下的所有子节点
  xpath(‘/div[@*]’)      选取所有带属性的div节点

'''

ret=selector.xpath("//p[@class='story']/*")
ret=selector.xpath("//p[@class='story']/a[@class]")

4.取多个路劲

'''
使用“|”运算符可以选取多个路径

表达式:                            结果:
    xpath(‘//div|//table’)         选取所有的div和table节点

'''

ret=selector.xpath("//p[@class='story']/a[@class]|//div[@class='d3']")
print(ret)

5.XPath轴

'''
轴可以定义相对于当前节点的节点集

轴名称:                      表达式:                                描述:
ancestor                      xpath(‘./ancestor::*’)                 选取当前节点的所有先辈节点(父、祖父)
ancestor-or-self              xpath(‘./ancestor-or-self::*’)         选取当前节点的所有先辈节点以及节点本身
attribute                     xpath(‘./attribute::*’)                选取当前节点的所有属性
child                         xpath(‘./child::*’)                    返回当前节点的所有子节点
descendant                    xpath(‘./descendant::*’)               返回当前节点的所有后代节点(子节点、孙节点)
following                     xpath(‘./following::*’)                选取文档中当前节点结束标签后的所有节点
following-sibing              xpath(‘./following-sibing::*’)         选取当前节点之后的兄弟节点
parent                       xpath(‘./parent::*’)                   选取当前节点的父节点
preceding                    xpath(‘./preceding::*’)                选取文档中当前节点开始标签前的所有节点

preceding-sibling            xpath(‘./preceding-sibling::*’)        选取当前节点之前的兄弟节点
self                         xpath(‘./self::*’)                     选取当前节点

6.功能函数

函数 用法 解释
starts-with xpath(‘//div[starts-with(@id,”ma”)]‘) 选取id值以ma开头的div节点
contains xpath(‘//div[contains(@id,”ma”)]‘) 选取id值包含ma的div节点
and xpath(‘//div[contains(@id,”ma”) and contains(@id,”in”)]‘) 选取id值包含ma和in的div节点
text() xpath(‘//div[contains(text(),”ma”)]‘) 选取节点文本包含ma的div节点

7.extract() 与 extract_frist()

extract()   指的是提取所有
extract_frist()   指的是提取第一个

8.contains


//*[starts-with(name(),'B')] 所有名字开头为字母B的节点
//a[contains(text(),"爬虫")] 所有包含“爬虫”字符串的a标签
tree.xpath('string(//dt[text()="面积"]/following-sibling::dd/text())')  包含 面积 的 dt 标签的兄弟标签

原文地址:https://www.cnblogs.com/kai-/p/11845783.html