2016-09-23 7 views
0

私はBeautifulsoup4でPython 3.5.1を実行しています。Beautifulsoupクラスから継承して、次のタスクを実行したい

私は現在、このコードを持っている:

from bs4 import BeautifulSoup 
import html5lib 

class LinkFinder(BeautifulSoup): 

    def __init__(self): 
    super().__init__() 

    def handle_starttag(self, name, attrs): 
    print(name) 

私は次のコードでクラスをインスタンス化する場合: findmylink = LinkFinder()と、私は次のコードfindmylink.feed("""<html><head><title>my name is good</title></head><body>hello world</body></html>""",'html5lib')と私のHTMLをロードします。

私は私のコンソールで次のエラーました:私は実際に

from html.parser import HTMLParser 
class LinkFinder(HTMLParser): 

    def __init__(self): 
     super().__init__() 

    def handle_starttag(self, tag, attrs): 
     print(tag) 

(私の場合、私が代わりにhtml.parserのBeautifulsoupを使用したい)次のサンプルコードを複製したい

'NoneType' object is not callable 

をクラスを次のコードで再インスタンス化すると、findmylink = LinkFinder()、次のコードを使用してHTMLをロードすると、という出力が表示されます。

html 
head 
title 
body 

これは望ましい出力です。

答えて

1

あなたはこの道を行くにしたい場合は、中にマークアップを受け入れるように実装を変更初期化し、すべての渡された引数をつかむためにhandle_starttag

で初期化
class LinkFinder(BeautifulSoup): 

    def __init__(self, markup): 
    super().__init__(markup, 'html.parser') 

    def handle_starttag(self, name, namespace, nsprefix, attrs): 
    print(name) 

l = LinkFinder("""<html><head><title>my name is good</title></head><body>hello world</body></html>""") 

プリントアウトは:

html 
head 
title 
body 

私はBeautifulSoupクラスではなくAttributeErrorを上げるの非定義された属性にNoneを返すように__getattr__をオーバーロードしていますかなり確信しています。それはあなたのエラーを引き起こしているものです:

print(type(BeautifulSoup().feed)) 
NoneType 
print(type(BeautifulSoup().feedededed)) 
NoneType 

と、BeautifulSoupはないHTMLParserとしてfeedの機能を持っていない(それは_feedを持っていないし、それはself.markupbuilderオブジェクトの基礎となるfeedを呼び出す)あなたはNoneを取得しますあなたが呼ぶオブジェクト。

+1

あなたのこと大丈夫です。しかし、私はこの実装では "html.parser"しか使用できないことを発見し、 "html5lib"のような他のパーサーは画面に何も出力しません。しかし、私はあなたの答えに固執しますが、 "html5lib"がうまくいかない理由がありますか? – Bluelily

2

なぜこのような珍しい方法でBeautifulSoupを使用する必要があるのか​​分かりません。

from bs4 import BeautifulSoup 

data = """<html><head><title>my name is good</title></head><body>hello world</body></html>""" 

soup = BeautifulSoup(data, "html5lib") 
for elm in soup.find_all(): 
    print(elm.name) 

プリント:あなたは、単に再帰的にHTMLツリー内のすべての要素の名前を取得したい場合は

html 
head 
title 
body 
+0

入力いただきありがとうございます。私はいつも呼び出すことができる機能が必要なため、私はこの方法には同意しません。 – Bluelily

関連する問題