花了半天时间整理了xpath最详细的全面教程!拿去用吧

使用时先安装 lxml 包

开始使用

和beautifulsoup类似,首先我们需要得到一个文档树

  • 把文本转换成一个文档树对象
from lxml import etree
if __name__ == '__main__':
    doc='''
        <div>
            <ul>
                 <li class="item-0"><a href="link1.html">first item</a></li>
                 <li class="item-1"><a href="link2.html">second item</a></li>
                 <li class="item-inactive"><a href="link3.html">third item</a></li>
                 <li class="item-1"><a href="link4.html">fourth item</a></li>
                 <li class="item-0"><a href="link5.html">fifth item</a> # 注意,此处缺少一个 </li> 闭合标签
             </ul>
         </div>
        '''

    html = etree.HTML(doc)
    result = etree.tostring(html)
    print(str(result,'utf-8'))
  • 把文件转换成一个文档树对象
from lxml import etree

# 读取外部文件 index.html
html = etree.parse('./index.html')
result = etree.tostring(html, pretty_print=True)    #pretty_print=True 会格式化输出
print(result)

均会打印出文档内容

节点、元素、属性、内容

xpath 的思想是通过 路径表达 去寻找节点。节点包括 元素 , 属性 ,和 内容

  • 元素举例
html ---> <html> ...</html>
div ---> <div> ...</div>
a  ---> <a> ...</a>

这里我们可以看到,这里的 元素 和html中的 标签 一个意思。单独的元素是无法表达一个路径的,所以单独的元素不能独立使用

路径表达式

/   根节点,节点分隔符,
    //  任意位置
    .   当前节点
    ..  父级节点
    @   属性

通配符

*   任意元素
    @*  任意属性
    node()  任意子节点(元素,属性,内容)

谓语

使用中括号来限定元素,称为谓语

//a[n] n为大于零的整数,代表子元素排在第n个位置的<a>元素
    //a[last()]   last()  代表子元素排在最后个位置的<a>元素
    //a[last()-]  和上面同理,代表倒数第二个
    //a[position()<3] 位置序号小于3,也就是前两个,这里我们可以看出xpath中的序列是从1开始
    //a[@href]    拥有href的<a>元素
    //a[@href='www.baidu.com']    href属性值为'www.baidu.com'的<a>元素
    //book[@price>2]   price值大于2的<book>元素

多个路径

用 | 连接两个表达式,可以进行 或 匹配

//book/title | //book/price

函数

xpath内置很多函数。更多函数查看 https://www.w3school.com.cn/xpath/xpath_functions.asp

  • contains(string1,string2)
  • starts-with(string1,string2)
  • ends-with(string1,string2) #不支持
  • upper-case(string) #不支持
  • text()
  • last()
  • position()
  • node()

可以看到last()也是个函数,在前面我们在谓语中已经提到过了

案例

定位元素

匹配多个元素,返回列表

from lxml import etree

if __name__ &#
  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值