zoukankan      html  css  js  c++  java
  • XPath 的使用

    XPath 的使用

       XPath,全称XML Path Language,即XML路径语言,它是一门在XML文档中查找信息的语言,最初用于搜寻XML文档,但是也同样适用于HTML文档的搜索。前面我们在解析或抽取网页信息时,使用的是正则表达式,虽然这是一个万能的方法,但是编写太麻烦了,一旦表达式写错就得不到正确的结果,还有就是可读性不强,写完后估计自己也不知道这是啥回事了,所以在爬虫时可以使用XPath来做相应数据的抽取。

      先列举XPath的常用规则:

    举例:

    //title[@lang='eng']   代表选择所有名称为 title,同时属性lang的值为eng的节点。

    1. 实例

    from lxml import etree
    text = '''
    <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>
    '''
    # 实例化一个XPath对象  etree.HTML(html文档)
    html = etree.HTML(text)
    result = etree.tostring(html)
    print(result.decode('utf-8'))

    首先导入lxml库的etree模块,然后声明了一段HTML文本,调用etree.HTML()初始化,这样就构造了一个XPath解析对象了。

    2. 所有节点

    使用//开头的XPath规则来选择所有符合的几点,以上面的HTML文本为例,如果要选取所有节点,可以这样实现:

    from lxml import etree
    html = etree.parse('./test.html',etree.HTMLParser())
    result = html.xpath('//*')
    print(result)

    这里使用*代表所有节点,也就是整个HTML文本中的所有节点都会被获取。返回的是一个列表,每个元素都是一个Element类型。

    当然,此处匹配也可以指定节点:

    from lxml import etree
    html = etree.parse('./test.html',etree.HTMLParser())
    result = html.xpath('//li')
    print(result)

    这里选取的是所有li节点,使用//然后直接加上节点名称即可,调用时直接使用xpath()方法即可。

    3. 子节点

    可以使用//或/来获取子节点,前者包括子孙节点,而后者仅仅是直接子节点:

    from lxml import etree
    html = etree.parse('./test.html',etree.HTMLParser())
    result = html.xpath('//li/a')
    print(result)

    上面得到的是一个包含所有li元素里面的直接子节点a的一个列表。

    from lxml import etree
    html = etree.parse('./test.html',etree.HTMLParser())
    result = html.xpath('//ul//a')

    上面获取到的是所有ul节点中的所有a节点。

    注意/和//的区别,/用于获取直接子节点,//用于获取子孙节点

    4. 父节点

    使用..可以查找父节点:

    from lxml import etree
    html = etree.parse('./test.html',etree.HTTPParser())
    result = html.xpath('//a[@href="link4.html"]/../@class')
    print(result)

    上面获取到的就是href属性为link4.html的所有a节点的父节点的class属性

    除此以外,还可以使用parent::来获取父节点:

    from lxml import etree
    html = etree.parse('./test.html',etree.HTTPParser())
    result = html.xpath('//a[@href="link4.html"]/parent::*/@class')

    5. 属性匹配

    使用@符号进行属性过滤,比如要选取class为item-1的li节点,可以这样实现:

    from lxml import etree
    html = etree.parse('./test.html',etree.HTTPParser())
    result = html.xpath('//li[@class="item-1"]')

    6. 文本获取

    使用text()方法既可获取节点中的文本(标签体):

    from lxml import etree
    html = etree.parse('./test.html',etree.HTMLParser())
    result = html.xpath('//li[@class="item-0"]/a/text()')
    print(result)
  • 相关阅读:
    《Linux系统free命令的使用》学习笔记
    《postfix MAIL服务搭建(第一篇):》RHEL6
    RHEL(RedHat Enterprise Linux)5/6 ISO镜像下载
    《samba搭建win客户端和linux客户端的区别》
    《怎样实现通过shell脚本将用户踢出系统》
    《DDNS服务器的搭建和案例解决方法》
    《Usermod:user lee is currently logged in 家目录不能改变解决方法》
    你们看不懂为什么写这个博客吧
    JS几种数组遍历方式以及性能分析对比
    从概念到业务来看 To B 和 To C 产品区别在哪?
  • 原文地址:https://www.cnblogs.com/jonas-von/p/9178313.html
Copyright © 2011-2022 走看看