前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >lxml的另一种用法

lxml的另一种用法

作者头像
Masimaro
发布2018-08-31 15:50:01
5320
发布2018-08-31 15:50:01
举报

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

代码语言:javascript
复制
from lxml import etree

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

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

代码语言:javascript
复制
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函数获取类中对应名称的函数,这个函数名称以标签名作为唯一标识,如果有该函数则调用,这样根据不同函数的调用就知道到了哪个标签里面,针对不同的标签编写不同的处理代码即可。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-10-24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档