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

  • 相关阅读:
    高格-一些特点话题【10】批次批号管理
    study Rust-4【所有权】这个太重要了!
    study Rust-3【表达式和函数】
    study Rust-2【环境与配置,随机数】
    unigui的错误delphi clientHeight:property clientheight does not exist【10】
    shr系统进入用户管理
    节点设置必录注意事项
    单据头字段设置必录
    插件强制设置单据体字段必录
    object转换为List<DynamicObject>
  • 原文地址:https://www.cnblogs.com/yoyoketang/p/9661273.html
Copyright © 2011-2022 走看看