target="_blank">WeiboSite'
my =
MyParser() my.feed(content)
3.
使用SGMLParser解析网页
SGMLParser也是Python自带的解析器,比HTMLParser更加易用。
下面给一个示例:
#!/usr/bin/env
python
import
urllib2 from 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)
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
就是标签名称,比如当遇到
,就会调用 start_pre,遇到
,就会调用 end_pre。attrs 为标签的参数,以 [(attribute, value), (attribute,
value), ...] 的形式传回。
4.
使用pyQuery解析网页
pyQuery 是
jQuery 在 python 中的实现,能够以 jQuery 的语法来操作解析 HTML
文档,十分方便。使用前需要安装,easy_install pyquery 即可,或者 Ubuntu 下
sudo apt-get
install python-pyquery
下面是一个示例:
from pyquery
import PyQuery as pyq doc=pyq(url=r' http://list.taobao.com/browse/cat-0.htm') cts=doc('.market-cat') for i in cts: print
'====',pyq(i).find('h4').text()
,'====' for j in
pyq(i).find('.sub'): print pyq(j).text() , print
'\n'
5.
使用BeautifulSoup解析网页
有个头痛的问题是,大部分的网页都没有完全遵照标准来写,各种莫名其妙的错误令人想要找出那个写网页的人痛打一顿。为了解决这个问题,我们可以选择著名的
BeautifulSoup 来解析 html
文档,它具有很好的容错能力。BeautifulSoup功能强大,值得深入学习一下。
-----
目前htmlparser有两个已知的bug:
1.不能准确的分别开标签和"自闭标签",看下面代码:
from HTMLParser import HTMLParser
class MyHTMLParser(HTMLParser):
def handle_starttag(self,tag,attrs):
print 'begin tag',tag
def handle_startendtag(self,tag,attrs):
print 'begin end
tag',tag
str1='
'
str2='
'
parser=MyHTMLParser()
parser.feed(str1) # 输出
"begin tag br"
parser.feed(str2) # 输出
"begin end br"
2.不能处理中文属性,比如说,如果网页里有这么一段:
< input type="submit" value=跳转到 >
那么解析到这一行时就会出错。错误原因是正则表达式有误。
attrfind = re.compile(
r'/s*([a-zA-Z_][-.:a-zA-Z_0-9]*)(/s*=/s*'
r'(/'[^/']*/'|"[^"]*"|[-a-zA-Z0-9./,:;+*%?!&$/(/)_#=~@]*))?')
attrfind 没有匹配中文字符。
可以更改这个匹配以修正这个错误。sgmllib则不存在这种错误。
参考:
用python解析html http://blog.csdn.net/adrianfeng/article/details/5881850
Python中使用HTMLParser解析html实例
http://www.jb51.net/article/60867.htm
Python 用HTMLParser解析HTML文件
http://andylin02.iteye.com/blog/908170