17

HTMLパーサーを使用して、Webサイトからデータをスクラップし、そうしている間にhtmlコーディングを削除しています。Beautiful Soup などのさまざまなモジュールを認識していますが、「外部」モジュールに依存しない道を進むことにしました。Eloff によって提供されたコード コードがあります: Python で文字列から HTML を削除します。

from HTMLParser import HTMLParser

class MLStripper(HTMLParser):
    def __init__(self):
        self.reset()
        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()

Python 3.1 で動作します。しかし、最近 Python 3.2.x にアップグレードしたところ、上記の HTML パーサー コードに関するエラーが発生することがわかりました。

私の最初のエラーは次の行を指しています:

s.feed(html)

...そしてエラーは...

AttributeError: 'MLStripper' object has no attribute 'strict'

それで、少し調べた後、「strict = True」を一番上の行に追加して...

class MLStripper(HTMLParser, strict=True)

ただし、次の新しいエラーが発生します。

TypeError: type() takes 1 or 3 arguments

何が起こるかを確認するために、「self」引数を削除し、「strict = True」に残しました...エラーをあきらめました:

NameError: global name 'self' is not defined

…と、「推測で推測している」という感じになりました。

class MLStripper(HTMLParser)行の 3 番目の引数が何になるかわかりませselfstrict=True。研究は啓蒙を投げかけませんでした。

4

1 に答える 1

37

をサブクラスHTMLParser化していますが、その__init__メソッドを呼び出していません。__init__メソッドに 1 行追加する必要があります。

def __init__(self):
    super().__init__()
    self.reset()
    self.fed = []

また、Python 3 の場合、インポート行は次のとおりです。

from html.parser import HTMLParser

これらの変更により、簡単な例が機能します。行を変更しないでくださいclass。それは関係ありません。

于 2012-06-16T13:26:17.990 に答える