zoukankan      html  css  js  c++  java
  • python笔记1--lxml.etree解析html

    前言

    lxml是一种使用Python编写的库,可以迅速、灵活地处理XML和HTML,学过xpath定位的,可以立马上手

    使用环境:

    python3.7

    lxml 4.3.3

    lxml安装

    pip install lxml,安装报错;指定版本为4.4.3时,安装成功

     

    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使用案例

    使用html解析器,最终是想获取html上的某些元素属性和text文本内容,接下来看下,用最少的代码,简单高效的找出想要的内容。

    比如要获取“这里是我的微信公众号:yoyoketang

    # 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)
    rs=demo.xpath('//p[@class="yoyo"]')
    t=rs[0].text
    print(t)  

     运行结果:

     

     从代码量上看,简单的三行代码就能找到想要的内容了,rs是xpath定位获取到的一个list对象,会找出所有符合条件的元素对象。可以用for循环查看详情。

    # 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)
    rs=demo.xpath('//p[@class="yoyo"]')
    print(rs) #list对象
    for j in rs:
        #打印定位到的内容
        print(etree.tostring(j,encoding="utf-8",pretty_print=True).decode("utf-8"))
        print(j.attrib)  

     运行结果

    [<Element p at 0x262b525a988>]
    <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笔记

    # 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)
    rs=demo.xpath('//p[@class="yoyo"]')
    print(rs[0].text)
    rs1=rs[0].xpath('//a[@id="link2"]')
    print(rs1[0].text)
    rs2=demo.xpath('//a[@id="link2"]')
    print(rs2[0].text)  

     运行结果

     Xpath

     注意

    etree.toString()返回的是bytes类型,需要调用decode方法将其转换成String类型

    经过处理后的html代码,会被自动修复,添加缺少的标签。

    越努力,越幸运!!! good good study,day day up!!!
  • 相关阅读:
    Bundle类
    intent.putExtra()方法参数详解
    6级技巧(一)
    6级核心词汇
    安卓应用运营知识:VersionCode和VersionName
    关于HTML、XHTML、CSS、XML的区别
    SQL记录-Linux CentOS配置ORACLE 12c
    Spark记录-Scala多线程
    Spark记录-Scala异常与处理
    Spark记录-Scala类和对象
  • 原文地址:https://www.cnblogs.com/canglongdao/p/13446258.html
Copyright © 2011-2022 走看看