• lxml的另一种用法


    python中lxml库是一个十分强大的xml解析库,最近在看《白帽子将web扫描》这本书的时候,里面提供了一种不同于以往的用法,因此在这将这个方法记录下来
    传统的lxml库的使用方法类似于下面这样:

    from lxml import etree
    
    tree = etree.HTML(html) #假定html是一个html文本字符串
    tag_a = tree.xpath("//a")

    这是一种DOM的解析方法,它事先生成了一个一个dom树tree,然后在树中根据xpath字符串筛选出我们想要的元素,至于具体的用法就不再在这演示了,百度lxml可以搜到很多东西
    书中提供了一种类似于SAX模型的解析方法,但是又有些不同,SAX模型一般有一些固定的函数需要去重写,比如进入到标签中和退出标签等等。在这种情况下,我们只知道它进入到了标签开始位置,但是并不知道进入的是何种标签。书中的那个写法达到了一个很好的效果,它能做到为每一个标签定义一个对应的处理函数,比如刚进入到a标签,就会调用我们自己定义的处理这个事件的函数,并且可以获取它对应的属性的列表,废话不多说,直接上代码:

    from lxml import etree
    class HtmlParser:
        def __init__(self):
            #在函数中定义一些属性,比如解析出来的url或者希望保存的中间变量
            parser = etree.HTMLParser(target=self, recover=True, encoding='utf-8')
                    try:
                etree.fromstring(self._html, parser)
            except ValueError:
                pass
        def start(self, tag, attrbs):
            meth = getattr(self, "_handle_" + tag + "_tag_start")
            meth(tag, attrbs)
        def _handle_a_tag_start(self, tag, attrbs):
            #dosomething
            pass
        def end(tag):
            meth = getattr(self, "_handle_" + tag + "_tag_end")
            meth(tag, attrbs)

    在调用fromstring()将字符串转化为dom时每当进入一个标签开始位置将调用start函数,而当即将离开该标签时调用end函数,start函数传入标签名tag和标签的属性列表attrbs。在这两个函数中使用getattr函数获取类中对应名称的函数,这个函数名称以标签名作为唯一标识,如果有该函数则调用,这样根据不同函数的调用就知道到了哪个标签里面,针对不同的标签编写不同的处理代码即可。

  • 相关阅读:
    VMware12中CentOS7网络设置
    技术牛人
    PHP程序员如何突破成长瓶颈(php开发三到四年)
    php多线程
    go git 安装配置与使用 (windows 7 64bit)
    php内核和瓦力上线部署
    VM虚拟机下安装Centos7.0图文教程
    php结合redis实现高并发下的抢购、秒杀功能
    php foreach循环中unset后续的键值问题
    excle导入
  • 原文地址:https://www.cnblogs.com/lanuage/p/7725686.html
Copyright © 2020-2023  润新知