无法在HTMLParser中访问新变量
我好像无法在HTMLParser中添加任何新变量。我在按照我看到的例子这里进行操作。在__init__里面添加变量时没有报错,但当我在一个方法中尝试访问这个变量时,却被告知它不存在。
#!/usr/bin/env python
from HTMLParser import HTMLParser
import urllib
class parse(HTMLParser):
def __init__(self, data):
HTMLParser.__init__(self)
self.feed(data)
self.foo = 'err'
def handle_starttag(self, tag, attrs):
print self.foo
if tag == 'a':
for attr, value in attrs:
if attr == 'href':
print value[10:]
continue
def handle_data(self, text):
pass
def handle_endtag(self, tag):
pass
page = urllib.urlopen('http://docs.python.org/library/htmlparser.html').read()
p = parse(page)
这是输出结果:
Traceback (most recent call last):
File "./doit.py", line 34, in <module>
p = parse(page)
File "./doit.py", line 9, in __init__
self.feed(data)
File "/usr/lib/python2.6/HTMLParser.py", line 108, in feed
self.goahead(0)
File "/usr/lib/python2.6/HTMLParser.py", line 148, in goahead
k = self.parse_starttag(i)
File "/usr/lib/python2.6/HTMLParser.py", line 271, in parse_starttag
self.handle_starttag(tag, attrs)
File "./doit.py", line 14, in handle_starttag
print self.foo
AttributeError: parse instance has no attribute 'foo'
谢谢你的帮助
2 个回答
2
你只需要交换这两行代码的位置。
self.feed(data)
self.foo = 'err'
调用 .feed()
时,会自动调用 .handle_starttag()
,但这个过程发生在你代码中创建属性之前。
其实更好的做法是,不要在构造函数里传入数据,而是直接显式地调用 .feed()
。
1
self.handle_starttag(tag, attrs)
在 HTMLParser.py
中被调用了
self.foo = 'err'
在你的代码中已经设置过了。
试试:
self.foo = 'err'
self.feed(data)