• 爬虫利器3:Xpath语法与lxml库


    1.安装lxml库

    pip install lxml

    2.lxml用法

    例子:

    首先我们利用它来解析 HTML 代码,先来一个小例子来感受一下它的基本用法。

     1 from lxml import etree
     2 
     3 text = '''
     4 <div>
     5    <ul>
     6        <li class="item-0"><a href= "link1.html">first item</a></li>
     7        <li class="item-1"><a href= "link2.htm2">second item</a></li>
     8        <li class="item-inactive"><a href= "link3.html">third item</a></li>
     9        <li class="item-1"><a href= "link4.html">fourth item</a></li>
    10        <li class="item-0"><a href= "link5.html">fifth item</a>
    11    </ul>
    12 </div>
    13 '''
    14 html = etree.HTML(text)
    15 result = etree.tostring(html)
    16 print result

    首先我们使用 lxml 的 etree 库,然后利用 etree.HTML 初始化,然后我们将其打印出来。

    其中,这里体现了 lxml 的一个非常实用的功能就是自动修正 html 代码,大家应该注意到了,最后一个 li 标签,其实我把尾标签删掉了,是不闭合的。不过,lxml 因为继承了 libxml2 的特性,具有自动修正 HTML 代码的功能。

    所以输出结果不仅补全了 li 标签,还添加了 body,html 标签,如下:

    文件读取

    除了直接读取字符串,还支持从文件读取内容。比如我们新建一个文件叫做 lzc.html,内容为:

    1 <div>
    2    <ul>
    3        <li class="item-0"><a href= "link1.html">first item</a></li>
    4        <li class="item-1"><a href= "link2.htm2">second item</a></li>
    5        <li class="item-inactive"><a href= "link3.html">third item</a></li>
    6        <li class="item-1"><a href= "link4.html">fourth item</a></li>
    7        <li class="item-0"><a href= "link5.html">fifth item</a></li>
    8    </ul>
    9 </div>

    利用 parse 方法来读取文件:

    1 html = etree.parse('lzc.html')
    2 result = etree.tostring(html,pretty_print=True)
    3 print result

    这种情况下lxml 没有自动修正 html 代码,且大如果标签不完整,会报错:

    XPath实例测试

    (1)获取所有的 <li> 标签:

    1 html = etree.parse('lzc.html')
    2 print type(html)
    3 result= html.xpath('//li')
    4 print result
    5 print len(result)
    6 print type(result)
    7 print type(result[0])

    运行结果:

    可见,etree.parse 的类型是 ElementTree,通过调用 xpath 以后,得到了一个列表,包含了 5 个 <li> 元素,每个元素都是 Element 类型

    (2)获取 <li> 标签的所有 class:

    html = etree.parse('lzc.html')
    result = html.xpath('//li/@class')
    print result

    运行结果

    (3)获取 <li> 标签下 href 为 link1.html 的 <a> 标签

    html = etree.parse('lzc.html')
    result1= html.xpath('//li/a[@href="link1.html"]')
    print result1

    运行结果

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

           注意这么写是不对的

    result2=html.xpath('//li/span')

    因为 / 是用来获取子元素的,而 <span> 并不是 <li> 的子元素,所以,要用双斜杠

    html = etree.parse('lzc.html')
    result2=html.xpath('//li//span')
    print result2

    运行结果

  • 相关阅读:
    查询sql数据库中表占用的空间大小
    清理sql2012数据库日志
    完美解决distinct中使用多个字段的方法
    【Visual Studio 扩展工具】如何在ComponentOneFlexGrid树中显示RadioButton
    关于ComponentOne For WinForm 的全新控件 – DataFilter数据切片器(Beta)
    “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
    【Visual Studio 扩展工具】使用ComponentOne中的GroupDefinition和SortDefinition属性保存和还原布局
    【Visual Studio 扩展工具】使用 ComponentOne迷你图控件,进行可视化数据趋势分析
    ComponentOne 产品经理:为什么要从C1Report迁移到FlexReport
    ActiveReports 大数据分析报告:贸易争端与中国企业数字化转型
  • 原文地址:https://www.cnblogs.com/171207xiaohutu/p/8324398.html
Copyright © 2020-2023  润新知