zoukankan      html  css  js  c++  java
  • xpath教程 2

    xpath教程 2 - lxml库

    这些就是XPath的语法内容,在运用到Python抓取时要先转换为xml。

    lxml库

    lxml 是 一个HTML/XML的解析器,主要的功能是如何解析和提取 HTML/XML 数据。

    lxml和正则一样,也是用 C 实现的,是一款高性能的 Python HTML/XML 解析器,我们可以利用之前学习的XPath语法,来快速的定位特定元素以及节点信息。

    lxml python 官方文档:http://lxml.de/index.html

    需要安装C语言库,可使用 pip 安装:pip install lxml (或通过wheel方式安装)

    初步使用

    我们利用它来解析 HTML 代码,简单示例:

    # lxml_test.py
    
    # 使用 lxml 的 etree 库
    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>
    '''
    
    #利用etree.HTML,将字符串解析为HTML文档
    html = etree.HTML(text)
    
    # 按字符串序列化HTML文档
    result = etree.tostring(html)
    
    print(result)
    

      

    输出结果:

    <html><body>
    <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>
    </body></html>
    

    lxml 可以自动修正 html 代码,例子里不仅补全了 li 标签,还添加了 body,html 标签。

    文件读取:

    除了直接读取字符串,lxml还支持从文件里读取内容。我们新建一个hello.html文件:

    <!-- hello.html -->
    
    <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"><span class="bold">third item</span></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>
    

      

    再利用 etree.parse() 方法来读取文件。

    # lxml_parse.py
    
    from lxml import etree
    
    # 读取外部文件 hello.html
    html = etree.parse('./hello.html')
    result = etree.tostring(html, pretty_print=True)
    
    print(result)
    

      

    输出结果与之前相同:

    <html><body>
    <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>
    </body></html>
    

    XPath实例测试

    1. 获取所有的 <li> 标签

    # xpath_li.py
    
    from lxml import etree
    
    html = etree.parse('hello.html')
    print type(html)  # 显示etree.parse() 返回类型
    
    result = html.xpath('//li')
    
    print result  # 打印<li>标签的元素集合
    print len(result)
    print type(result)
    print type(result[0])
    

      

    输出结果:

    <type 'lxml.etree._ElementTree'>
    [<Element li at 0x1014e0e18>, <Element li at 0x1014e0ef0>, <Element li at 0x1014e0f38>, <Element li at 0x1014e0f80>, <Element li at 0x1014e0fc8>]
    5
    <type 'list'>
    <type 'lxml.etree._Element'>
    

    2. 继续获取<li> 标签的所有 class属性

    # xpath_li.py
    
    from lxml import etree
    
    html = etree.parse('hello.html')
    result = html.xpath('//li/@class')
    
    print result
    

      

    运行结果

    ['item-0', 'item-1', 'item-inactive', 'item-1', 'item-0']
    

    3. 继续获取<li>标签下hre 为 link1.html 的 <a> 标签

    # xpath_li.py
    
    from lxml import etree
    
    html = etree.parse('hello.html')
    result = html.xpath('//li/a[@href="link1.html"]')
    
    print result
    

      

    运行结果

    [<Element a at 0x10ffaae18>]
    

    4. 获取<li> 标签下的所有 <span> 标签

    # xpath_li.py
    
    from lxml import etree
    
    html = etree.parse('hello.html')
    
    #result = html.xpath('//li/span')
    #注意这么写是不对的:
    #因为 / 是用来获取子元素的,而 <span> 并不是 <li> 的子元素,所以,要用双斜杠
    
    result = html.xpath('//li//span')
    
    print result
    

      

    运行结果

    [<Element span at 0x10d698e18>]
    

    5. 获取 <li> 标签下的<a>标签里的所有 class

    # xpath_li.py
    
    from lxml import etree
    
    html = etree.parse('hello.html')
    result = html.xpath('//li/a//@class')
    
    print result
    

      

    运行结果

    ['blod']
    

    6. 获取最后一个 <li> 的 <a> 的 href

    # xpath_li.py
    
    from lxml import etree
    
    html = etree.parse('hello.html')
    
    result = html.xpath('//li[last()]/a/@href')
    # 谓语 [last()] 可以找到最后一个元素
    
    print result
    

      

    运行结果

    ['link5.html']
    

    7. 获取倒数第二个元素的内容

    # xpath_li.py
    
    from lxml import etree
    
    html = etree.parse('hello.html')
    result = html.xpath('//li[last()-1]/a')
    
    # text 方法可以获取元素内容
    print result[0].text
    

      

    运行结果

    fourth item
    

    8. 获取 class 值为 bold 的标签名

    # xpath_li.py
    
    from lxml import etree
    
    html = etree.parse('hello.html')
    
    result = html.xpath('//*[@class="bold"]')
    
    # tag方法可以获取标签名
    print result[0].tag
    

      

    运行结果

    span
  • 相关阅读:
    Reading papers_2(与GMM相关,ing...)
    Matlab DIP(瓦)ch11表示与描述练习
    HMM学习笔记_1(从一个实例中学习DTW算法)
    Matlab DIP(瓦)ch10图像分割练习
    前景检测算法_2(帧差法1)
    目标跟踪学习笔记_3(particle filter初探2)
    基础学习笔记之opencv(2):haartraining前将统一图片尺寸方法
    Reading papers_5(与human activity analysis综述相关,ing...)
    总结系列_4(C++知识学习,续...)
    HMM学习笔记_2(从一个实例中学习HMM前向算法)
  • 原文地址:https://www.cnblogs.com/andy9468/p/10143752.html
Copyright © 2011-2022 走看看