SGMLParser
Python 默认自带 HTMLParser 以及 SGMLParser 等等解析器,前者实在是太难用了,我就用 SGMLParser 写了一个示例程序:
import urllib2from sgmllib import SGMLParser class ListName(SGMLParser): def __init__(self): SGMLParser.__init__(self) self.is_h4 = "" self.name = [] def start_h4(self, attrs): self.is_h4 = 1 def end_h4(self): self.is_h4 = "" def handle_data(self, text): if self.is_h4 == 1: self.name.append(text) content = urllib2.urlopen('http://list.taobao.com/browse/cat-0.htm').read()listname = ListName()listname.feed(content)for item in listname.name: print item.decode('gbk').encode('utf8') |
很简单,这里定义了一个叫做 ListName
的类,继承 SGMLParser
里面的方法。使用一个变量 is_h4
做标记判定 html 文件中的 h4
标签,如果遇到 h4
标签,则将标签内的内容加入到 List
变量 name
中。解释一下 start_h4()
和 end_h4()
函数,他们原型是 SGMLParser 中的
start_tagname(self, attrs)
end_tagname(self)
tagname
就是标签名称,比如当遇到 <pre>
,就会调用 start_pre
,遇到 </pre>
,就会调用end_pre
。attrs
为标签的参数,以 [(attribute, value), (attribute, value), ...]
的形式传回。
输出:
虚拟票务数码市场家电市场女装市场男装市场童装童鞋女鞋市场男鞋市场内衣市场箱包市场服饰配件珠宝饰品美容市场母婴市场家居市场日用市场食品/保健运动鞋服运动户外汽车用品玩具市场文化用品市场爱好市场生活服务
如果有乱码,可能是与网页编码不一致,需要替换最后一句 deconde()
的参数,我在香港淘宝默认用的是繁体编码。各位可以 copy 上面的代码自己试试,把淘宝的商品目录抓下来,就是这么简单。稍微改改,就可以抽取二级分类等其他信息