zoukankan      html  css  js  c++  java
  • 12.Python爬虫利器三之Xpath语法与lxml库的用法

    LXML解析库使用的是Xpath语法:

    XPath 是一门语言

    XPath可以在XML文档中查找信息

    XPath支持HTML

    XPath通过元素和属性进行导航

    XPath可以用来提取信息

    XPath比正则表达式厉害

    XPath比正则表达式简单

    lxml使用方法:

    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>
         </ul>
     </div>
    '''
    
    html = etree.HTML(text)  #使用etree.HTML初始化
    result = etree.tostring(html) #将初始化的HTML转化成string 
    print result

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

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

    所以输出结果是这样的

    <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>
    #不仅补全了 li 标签,还添加了 body,html 标签。

    如何使用XPATH:

    安装lxml库

    from lxml import etree

    Selector = etree.HTML(网页源代码)

    Selector.xpath(一段神奇的符号)

    XPath与HTML结构

    获取网页元素的Xpath

    应用XPath提取内容

    案例1:

    html = '''<!DOCTYPE html>
    <html>
    <head lang="en">
        <meta charset="UTF-8">
        <title>测试-常规用法</title>
    </head>
    <body>
    <div id="content">
        <ul id="useful">
            <li>这是第一条信息</li>
            <li>这是第二条信息</li>
            <li>这是第三条信息</li>
        </ul>
        <ul id="useless">
            <li>不需要的信息1</li>
            <li>不需要的信息2</li>
            <li>不需要的信息3</li>
        </ul>
        <div id="url">
            <a href="http://jikexueyuan.com">极客学院</a>
            <a href="http://jikexueyuan.com/course/" title="极客学院课程库">点我打开课程库</a>
        </div>
    </div>
    </body>
    </html>
    '''
    selector = etree.HTML(html)
    #提取文本  提取文本内容:/text()
    content= selector.xpath('//ul[@id="useless"]/li/text()') #提取id属性为useless下面li标签的文本信息
    content1 = selector.xpath('//ul/li/text()') #提取所有li标签的文本信息
    content2 = selector.xpath('//div[@id="content"]/ul[@id="useful"]/li/text()') #提取id属性为useful下面li标签的文本信息
    for each in content2:
        print each
    
    #提取属性
    link = selector.xpath('//a/@href')  #提取属性内容: /@xxxx
    for each in link:
        print each
    title = selector.xpath('//a/@title')  #提取属性内容: /@xxxx
    print title[0]

    xpath基本语法

    //定位根节点

    /往下层寻找

    提取文本内容:/text()

    提取属性内容: /@xxxx

    ===================

    xpath的特殊用法

    1.以相同的字符开头

    2.标签套标签

    案例1

    html1 = '''
    <!DOCTYPE html>
    <html>
    <head lang="en">
        <meta charset="UTF-8">
        <title>测试-特殊用法</title>
    </head>
    <body>
        <div id="test-1">需要的内容1</div>
        <div id="test-2">需要的内容2</div>
        <div id="testfault">需要的内容3</div>
    </body>
    </html>
    '''
    
    selector = etree.HTML(html1)
    content = selector.xpath('//div[starts-with(@id,"test")]/text()')
    for each in content:
        print each

    案例2:

    html2 = '''
    <!DOCTYPE html>
    <html>
    <head lang="en">
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <div id="test3">
            我左青龙,
            <span id="tiger">
                右白虎,
                <ul>上朱雀,
                    <li>下玄武。</li>
                </ul>老牛在当中,
            </span>龙头在胸口。
        </div>
    </body>
    </html>
    '''
    selector1=etree.HTML(html2)
    content1 = selector1.xpath('//div[@id="test3"]/text()')
    for each in content1:
        print  each
    
    data = selector1.xpath('//div[@id="test3"]')[0]
    info = data.xpath('string(.)')
    print info
  • 相关阅读:
    SQL语法:查询此表有另外一个表没有的数据
    .NET平台开源项目速览-最快的对象映射组件Tiny Mapper之项目实践
    win7 64 安装Oracle 11G 、使用PLSQL进行连接 标准实践
    json 筛选数据 $.grep过滤数据
    bootstrap table 行号 显示行号 添加行号 bootstrap-table 行号
    ajax 请求二进制流 图片 文件 XMLHttpRequest 请求并处理二进制流数据 之最佳实践
    JS中判断JSON数据是否存在某字段的方法 JavaScript中判断json中是否有某个字段
    json 数字key json 数字作为主键
    ajax 跨域 headers JavaScript ajax 跨域请求 +设置headers 实践
    扩展:gridview 空数据时显示表头
  • 原文地址:https://www.cnblogs.com/stephenmc/p/7593160.html
Copyright © 2011-2022 走看看