• python笔记27-lxml.etree解析html


    前言

    之前分享过一个python爬虫beautifulsoup框架可以解析html页面,最近看到lxml框架的语法更简洁,学过xpath定位的,可以立马上手。
    使用环境:
    python 3.6
    lxml 4.2.4

    lxml安装

    使用pip安装lxml库

    $ pip install lxml

    pip show lxml查看版本号

    $ pip show lxml

    html解析

    这里用到etree.HTML方法把html的文本内容解析成html对象
    要打印html内容,可以用etree.tostring方法,encoding="utf-8"参数可以正常输出html里面的中文内容。pretty_print=True是以标准格式输出

    # coding:utf-8
    
    from lxml import etree
    
    htmldemo = '''
    <meta charset="UTF-8"> <!-- for HTML5 -->
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <html><head><title>yoyo ketang</title></head>
    <body>
    <b><!--Hey, this in comment!--></b>
    <p class="title"><b>yoyoketang</b></p>
    <p class="yoyo">这里是我的微信公众号:yoyoketang
    <a href="http://www.cnblogs.com/yoyoketang/tag/fiddler/" class="sister" id="link1">fiddler教程</a>,
    <a href="http://www.cnblogs.com/yoyoketang/tag/python/" class="sister" id="link2">python笔记</a>,
    <a href="http://www.cnblogs.com/yoyoketang/tag/selenium/" class="sister" id="link3">selenium文档</a>;
    快来关注吧!</p>
    <p class="story">...</p>
    '''
    
    # etree.HTML解析html内容
    demo = etree.HTML(htmldemo)
    # 打印解析内容str
    t = etree.tostring(demo, encoding="utf-8", pretty_print=True)
    print(t.decode("utf-8"))
    

    运行结果

    <html>
      <head><meta charset="UTF-8"/> <!-- for HTML5 -->
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>yoyo ketang</title>
    </head>
      <body>
    <b><!--Hey, this in comment!--></b>
    <p class="title"><b>yoyoketang</b></p>
    <p class="yoyo">这里是我的微信公众号:yoyoketang
    <a href="http://www.cnblogs.com/yoyoketang/tag/fiddler/" class="sister" id="link1">fiddler教程</a>,
    <a href="http://www.cnblogs.com/yoyoketang/tag/python/" class="sister" id="link2">python笔记</a>,
    <a href="http://www.cnblogs.com/yoyoketang/tag/selenium/" class="sister" id="link3">selenium文档</a>;
    快来关注吧!</p>
    <p class="story">...</p>
    </body>
    </html>
    

    soupparser解析器

    soupparser解析器比上面的etree.HTML容错性要好一点,因为其处理不规范的html的能力比etree强太多。

    import lxml.html.soupparser as soupparser
    demo = soupparser.fromstring(htmldemo)
    t = etree.tostring(demo, encoding="utf-8", pretty_print=True)
    
    print(t.decode("utf-8"))
    

    xpath使用案例

    使用htnl解析器,最终是想获取html上的某些元素属性和text文本内容,接下来看下,用最少的代码,简单高效的找出想要的内容。
    比如要获取“这里是我的微信公众号:yoyoketang”

    # coding:utf-8
    
    from lxml import etree
    
    htmldemo = '''
    复制上面的html内容
    '''
    
    # etree.HTML解析html内容
    demo = etree.HTML(htmldemo)
    
    nodes = demo.xpath('//p[@class="yoyo"]')
    # 获取文本
    t = nodes[0].text
    print(t)
    
    

    运行结果:

    这里是我的微信公众号:yoyoketang

    从代码量上看,简单的三行代码就能找到想要的内容了,比之前的beautifulsoup框架要简单高效的多

    nodes是xpath定位获取到的一个list对象,会找出所有符合条件的元素对象。可以用for 循环查看详情

    # coding:utf-8
    
    from lxml import etree
    
    htmldemo = '''
    复制上面的html内容
    '''
    
    # etree.HTML解析html内容
    demo = etree.HTML(htmldemo)
    
    nodes = demo.xpath('//p[@class="yoyo"]')
    
    print(nodes)  # list对象
    
    for i in nodes:
        # 打印定位到的内容
        print(etree.tostring(i, encoding="utf-8", pretty_print=True).decode("utf-8"))
        # 元素属性,字典格式
        print(i.attrib)
    

    运行结果

    [<Element p at 0x2bcd388>]
    <p class="yoyo">这里是我的微信公众号:yoyoketang
    <a href="http://www.cnblogs.com/yoyoketang/tag/fiddler/" class="sister" id="link1">fiddler教程</a>,
    <a href="http://www.cnblogs.com/yoyoketang/tag/python/" class="sister" id="link2">python笔记</a>,
    <a href="http://www.cnblogs.com/yoyoketang/tag/selenium/" class="sister" id="link3">selenium文档</a>;
    快来关注吧!</p>
    
    
    {'class': 'yoyo'}
    

    二次查找

    通过xpath定位语法//p[@class="yoyo"]定位到的是class="yoyo"这个元素以及它的所有子节点,如果想定位其中一个子节点,可以二次定位,继续xpath查找,如获取:python笔记

    nodes = demo.xpath('//p[@class="yoyo"]')
    
    t1 = nodes[0].xpath('//a[@id="link2"]')
    print(t1[0].text)
    
    

    运行结果

    python笔记

    作者:上海-悠悠 python自动化交流 QQ群:779429633

  • 相关阅读:
    poj 2187 Beauty Contest(旋转卡壳)
    poj 2540 Hotter Colder(极角计算半平面交)
    poj 1279 Art Gallery(利用极角计算半平面交)
    poj 3384 Feng Shui(半平面交的联机算法)
    poj 1151 Atlantis(矩形面积并)
    zoj 1659 Mobile Phone Coverage(矩形面积并)
    uva 10213 How Many Pieces of Land (欧拉公式计算多面体)
    uva 190 Circle Through Three Points(三点求外心)
    zoj 1280 Intersecting Lines(两直线交点)
    poj 1041 John's trip(欧拉回路)
  • 原文地址:https://www.cnblogs.com/yoyoketang/p/9661273.html
Copyright © 2020-2023  润新知