не может получить доступ к новым переменным в HTMLParser - PullRequest
1 голос
/ 25 января 2011

Я не могу добавить доступ к любым новым переменным в 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 голосов
/ 25 января 2011

Вам просто нужно поменять две строки

self.feed(data)
self.foo = 'err'

Вызов .feed() неявно вызывает .handle_starttag(), но это делается до создания атрибута в вашем коде.

Вероятно, еще лучшей идеей было бы вообще не передавать данные конструктору, а явно вызывать .feed().

1 голос
/ 25 января 2011
self.handle_starttag(tag, attrs)

вызывается в HTMLParser.py до

self.foo = 'err'

было установлено в вашем коде.

Попробуйте:

self.foo = 'err'
self.feed(data)
...