鄙人学python不久,老看语法甚是无聊,便想找了一个例子玩玩。看到一个网页图片抓取的例子,源代码见http://blog.csdn.net/ipursuei/article/details/8591297,亲测可用。
其中比较重要的一个环节便是对html的解析。
我搜了一下常用的python的网页解析有
1. SGMLParser
2. HTMLParser
3. BeautifulSoup
4. lxml
其中前三种较为常用。本例子中用的是SGMLParser,这里稍加说明。
sgmllib.py 包含一个重要的类: SGMLParser。SGMLParser 将 HTML 分解成有用的片段,比如开始标记和结束标记。一旦它成功地分解出某个数据为一个有用的片段,它会根据所发现的数据,调用一个自身内部的方法。为了使用这个分析器,您需要子类化 SGMLParser 类,并且覆盖这些方法。
当SGMLParser遇到一个开始标签的时候,如<pre id="a">,那么它则调用start_xx方法(这里xx就是pre),同时把属性名字和属性值传到方法中,万一此方法不存在,那么调用unknown_starttag方法。
对于一个结束标签,执行的流程也是类似,首先找end_xx方法,找不到的话调用unknown_endtag方法。
SGMLParser在过字符串的时候还能处理其余六种情况。字符引用,如 ,调用handle_charref()方法,同时把160作为参数;实体引用,如©,调用handle_entityref()方法,其中copy作为参数;调用handle_comment()方法处理注释;处理指令,如<?...>,调用handle_pi()方法,这个我很少接触;处理声明,对于HTML来说主要是DOCTYPE,调用handle_decl()方法;最后是处理普通文本的handle_data()方法。
当我们调用feed()方法后,以上八类方法就会在过字符串的时候自动调用,最后我们调用close()方法结束。
SGMLParser中对输入的字符串实际上不作处理,整个类只是作为一个框架。我们使用的时候可以继承这个类,并重写这些方法实现自己的需求。