2017-03-24 5 views
1

HTMLには、MDNにリストされている空の要素の概念があります。しかし、美しいスープは、それらを適切に処理していないよう:美しいスープを使用して空のhtmlタグを正しく解析します。

import bs4 

soup = bs4.BeautifulSoup(
    '<div><input name=the-input><label for=the-input>My label</label></div>', 
    'html.parser' 
) 
print(soup.contents) 

私が手:

[<div><input name="the-input"><label for="the-input">My label</label></input></div>] 

すなわち、入力がラベルを折り返しています。

質問:これを適切に解析するために美しいスープを得る方法はありますか?または、私がまだ見つけていないこの行動の公式な説明がありますか?

非常に少なくとも私のようなものを期待したい:

[<div><input name="the-input"></input><label for="the-input">My label</label></div>] 

すなわちを入力は自動的にラベルの前に閉じます。

答えて

3

に試してみるであろう、lxmlを使用するように言うでしょう、ウェブブラウザとして文書を解析し、します(この場合はlxmlのように)。必要に応じてタグを追加/閉じることでドキュメントツリーを修正しようとします。

あなたの例では、私は、パーサーとしてlxmlのを使用しました、それは次のような結果が得られた:lxmlは、彼らがソースに存在していなかったので、それが理由であるHTML & bodyタグを追加することを

soup = bs4.BeautifulSoup(
'<div><input name=the-input><label for=the-input>My label</label></div>', 
'lxml' 
) 
print(soup.body.contents) 

[<div><input name="the-input"/><label for="the-input">My label</label></div>] 

注意を私はbodyの内容を印刷しました。

+0

ありがとう、役に立つリンクを知っている! – daphtdazz

3

私はスープがこのhtml構造を修正するためにできることをしていると言いますが、それは実際にはいくつかの機会に役立ちます。

とにかく、あなたのケースのために、私は彼らのdocumentationhtml5libに述べたように、あなたが望むようなHTMLの構造を解析し、または多分parsel

関連する問題