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

  • 相关阅读:
    在Perl里 对象就是hash引用
    第十二章 对象(上):
    连锁百货企业数据分析系统建设方案
    连锁百货企业数据分析系统建设方案
    java.lang.ClassNotFoundException: com.fasterxml.jackson.core.JsonProcessingException
    通过Net::Ping 理解Perl的面向对象
    org.springframework.http.converter.json.MappingJacksonHttpMessageConverter
    Attempt to refer to a unregistered pool by its alias 'dbpool'
    Error:[$parse:lexerr]
    keepalived 监测域名解析脚本
  • 原文地址:https://www.cnblogs.com/yoyoketang/p/9661273.html
Copyright © 2011-2022 走看看