zoukankan      html  css  js  c++  java
  • 爬虫利器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

    运行结果

  • 相关阅读:
    redis集群报错,(error) MOVED 15495 127.0.0.1:7003
    在云服务器上时候,我关闭了防火墙还是不能连接!
    redis 集群安装 3主3从3台云主机
    ajax完成团队信息异步添加【实际项目】
    众创项目首页推荐需求
    添加删除表格(js完成)【自己实际项目】
    【JPA 级联保存/级联删除】@OneToMany (双向) 一对多【转】
    页面提交 string数组和list对象集合举例
    Form表单如何传递List数组对象到后台的解决办法(转)
    实现同时提交多个form(基础方法) 收集(转)
  • 原文地址:https://www.cnblogs.com/171207xiaohutu/p/8324398.html
Copyright © 2011-2022 走看看