lxml的另一种用法
来源:互联网 发布:雷达回波数据 编辑:程序博客网 时间:2024/06/05 10:21
python中lxml库是一个十分强大的xml解析库,最近在看《白帽子将web扫描》这本书的时候,里面提供了一种不同于以往的用法,因此在这将这个方法记录下来
传统的lxml库的使用方法类似于下面这样:
from lxml import etreetree = etree.HTML(html) #假定html是一个html文本字符串tag_a = tree.xpath("//a")
这是一种DOM的解析方法,它事先生成了一个一个dom树tree,然后在树中根据xpath字符串筛选出我们想要的元素,至于具体的用法就不再在这演示了,百度lxml可以搜到很多东西
书中提供了一种类似于SAX模型的解析方法,但是又有些不同,SAX模型一般有一些固定的函数需要去重写,比如进入到标签中和退出标签等等。在这种情况下,我们只知道它进入到了标签开始位置,但是并不知道进入的是何种标签。书中的那个写法达到了一个很好的效果,它能做到为每一个标签定义一个对应的处理函数,比如刚进入到a标签,就会调用我们自己定义的处理这个事件的函数,并且可以获取它对应的属性的列表,废话不多说,直接上代码:
from lxml import etreeclass 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函数获取类中对应名称的函数,这个函数名称以标签名作为唯一标识,如果有该函数则调用,这样根据不同函数的调用就知道到了哪个标签里面,针对不同的标签编写不同的处理代码即可。
阅读全文
0 0
- lxml的另一种用法
- 人民币的另一种用法
- using的另一种用法
- using的另一种用法
- 异常的另一种用法
- scanf的另一种用法
- marker的另一种用法
- menu的另一种用法
- Python中lxml库的用法
- BeautifulSoup和lxml的基本用法示例
- Xpath语法与lxml库的用法
- String.Trim的另一种用法
- mdev -s的另一种用法
- java数组的另一种用法
- 关于Session的另一种用法
- 模板函数的另一种用法
- C#-using的另一种用法
- SharedPreferences 的另一种场景的用法
- jquery和javascript屏蔽右键菜单及阻止事件冒泡
- Angular 环境安装与配置
- 软件的国际化、Jstl国际化标签
- 一分钟了解“be 形容词1 and 形容词2 的用法”
- win10下MongoDB安装与配置
- lxml的另一种用法
- 一个java程序是怎样运行起来的(3)
- Linux初相识(一)
- php 声明变量
- HDU 5573-Binary Tree (构造)
- 简单封装template.js
- Yann LeCun:深度学习与人工智能的未来(附PPT与译文)
- 一分钟了解“matlab的switch-case语句”
- Android动画框架(一)----视图动画&帧动画