2

html.parser Python 3.2を使用して、ドキュメントから直接例を試しました。

from html.parser import HTMLParser

class MyHTMLParser(HTMLParser):
    def handle_starttag(self, tag, attrs):
        print("Encountered a start tag:", tag)
    def handle_endtag(self, tag):
        print("Encountered an end tag :", tag)
    def handle_data(self, data):
        print("Encountered some data  :", data)

parser = MyHTMLParser(strict=False)
parser.feed('<html><head><title>Test</title></head>'
            '<body><h1>Parse me!</h1></body></html>')

ドキュメントに示されている結果を取得する代わりに、次のようになります。

Encountered some data  : <html>
Encountered some data  : <head>
Encountered some data  : <title>
Encountered some data  : Test
Encountered an end tag : title
Encountered an end tag : head
Encountered some data  : <body>
Encountered some data  : <h1>
Encountered some data  : Parse me!
Encountered an end tag : h1
Encountered an end tag : body
Encountered an end tag : html

何らかの理由で、一部のタグをデータとして扱いますが、strict=Falsestrict=True正しい結果が得られた場合:

Encountered a start tag: html
Encountered a start tag: head
Encountered a start tag: title
Encountered some data  : Test
Encountered an end tag : title
Encountered an end tag : head
Encountered a start tag: body
Encountered a start tag: h1
Encountered some data  : Parse me!
Encountered an end tag : h1
Encountered an end tag : body
Encountered an end tag : html
4

1 に答える 1

2

これは修正されたバグでした(http://bugs.python.org/issue13273)。実際、 http://hg.python.org/cpython/log/9ce5d456138b/Lib/html/parser.pyを見るとStrict=False、;の問題に関するログメッセージがたくさんあります。これはまだベータ版と見なされるべきだとほとんど感じています。

ファイルの最新バージョン(http://hg.python.org/cpython/raw-file/9ce5d456138b/Lib/html/parser.py)を取得して使用すると、少なくともドキュメントの例が再び機能します。 。それでも、個人的には、現時点でStrict=Falseが「重要なアプリケーション」で動作することを信頼することに少しうんざりしています。

于 2012-02-18T17:43:09.663 に答える