如何修复这个 AttributeError 错误?

18

我昨天安装了一个stripe包,现在我的应用程序不能运行。我想知道问题出在哪里。是与PyShellHTMLParser有关还是其他原因。我同时使用GAE标签发布,希望从日志跟踪中可以得到有关问题的线索:

MLStripper instance has no attribute 'rawdata'
Traceback (most recent call last):
  File "/base/python_runtime/python_lib/versions/1/google/appengine/ext/webapp/_webapp25.py", line 703, in __call__
    handler.post(*groups)
  File "/base/data/home/apps/ting-1/1.354723388329082800/ting.py", line 2070, in post
    pitch_no_tags = strip_tags(pitch_original)
  File "/base/data/home/apps/ting-1/1.354723388329082800/ting.py", line 128, in strip_tags
    s.feed(html)
  File "/base/python_runtime/python_dist/lib/python2.5/HTMLParser.py", line 107, in feed
    self.rawdata = self.rawdata + data
AttributeError: MLStripper instance has no attribute 'rawdata'

这是 MLStripper:

from HTMLParser import HTMLParser

class MLStripper(HTMLParser):
    def __init__(self):
        set()
        self.fed = []
    def handle_data(self, d):
        self.fed.append(d)
    def get_data(self):
        return ''.join(self.fed)

def strip_tags(html):
    s = MLStripper()
    s.feed(html)
    return s.get_data()

昨天之前,MLStripper一直工作得很好。

以下是我的其他问题:

https://stackoverflow.com/questions/8152141/how-to-fix-this-attributeerror-with-htmlparser-py

https://stackoverflow.com/questions/8153300/how-to-fix-a-corrupted-pyshell-py

4个回答

33

你发布的代码存在一两个问题(主要是关于正确初始化HTMLParser的问题)。

试着运行这个修改过的版本:

from HTMLParser import HTMLParser

class MLStripper(HTMLParser):
    def __init__(self):
        # initialize the base class
        HTMLParser.__init__(self)

    def read(self, data):
        # clear the current output before re-use
        self._lines = []
        # re-set the parser's state before re-use
        self.reset()
        self.feed(data)
        return ''.join(self._lines)

    def handle_data(self, d):
        self._lines.append(d)

def strip_tags(html):
    s = MLStripper()
    return s.read(html)

html = """Python's <code>easy_install</code>
 makes installing new packages extremely convenient.
 However, as far as I can tell, it doesn't implement
 the other common features of a dependency manager -
 listing and removing installed packages."""

print strip_tags(html)

非常感谢您的回答。它运行得很好。您介意为我添加一些代码注释以便我理解吗?还有,您认为为什么这个程序在过去几个月一直能够正常工作,突然间停止工作了呢?再次感谢。 - Zeynel
1
@Zeynel。我已经添加了一些注释,以显示我对您原始脚本所做的主要更改。至于为什么您之前的脚本停止工作:如果不知道您系统上最近发生了什么变化,那就很难说。但无论如何,我认为修改后的脚本更加正确。 - ekhumoro
任何未来可能访问此处的StackOverflow用户:如果您覆盖了__init__方法,这是特别好的建议。 - noɥʇʎԀʎzɐɹƆ
2
在派生类中定义 init 时,请记得显式调用基类的 __init__。否则,派生类的 init 将覆盖基类的 __init__,这会导致原始帖子中出现未定义属性问题。 - ToonZ

1
这个错误还会在HTMLParser类中覆盖重置方法时出现。
在我的情况下,我添加了一个名为reset的方法用于其他功能,并发现虽然Python没有告诉您这样做有问题(也没有任何迹象表明我正在覆盖任何内容),但它会破坏HTMLParser类。

1

您需要在超类HTMLParser中调用init方法。

您也可以通过以下方式进行操作:

class MLStripper(HTMLParser):
    def __init__(self):
        super(MLStripper, self).__init__()
        set()
        self.fed = []

0

我有类似的问题,我的意思是在原始数据上出现属性错误。

一开始,我使用了以下语法,看起来是正确的。

class pdbResaHTMLParser(HTMLParser):
    def __init__(self,booking: Booking):
        super(HTMLParser, self).__init__()
        theBooking = booking

最终它以...结束了

AttributeError: 'pdbResaHTMLParser' object has no attribute 'rawdata'

当后来调用了feed方法时。

阅读那篇文章后,我改变了代码,虽然没有真正的希望,但是改变了如下:

class pdbResaHTMLParser(HTMLParser):
    def __init__(self,booking: Booking):
        HTMLParser.__init__(self)
        #super(HTMLParser, self).__init__()
        theBooking = booking

然后它就可以工作了。

这让我感到困惑,我原本认为我们做的两种语法是相同的,但看起来它们并不相同。

如果有人能解释为什么它们不相等,那就太好了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接