2012-04-30 8 views
0

html5libというユーザーからカスタムHTMLを検証しています。問題は、html5libがhtml,headbodyタグを追加することです。これは必要ありません。html5lib。 html、head、bodyタグを追加せずに有効なhtmlを取得するには?

parser = html5lib.HTMLParser(tree=treebuilders.getTreeBuilder("simpleTree")) 
f = open('/home/user/ex.html') 
doc = parser.parse(f) 
doc.toxml() 
'<html><head/><body><div>\n <a href="http://speedhunters.com">speedhunters.com\n</a></div><a href="http://speedhunters.com">\n</a></body></html>' 

これは、検証された消毒することができますが、どのように私は削除したり、木にこれらのタグを追加することを防止することができますか? replaceを使用しないことを意味します。

+2

私は猫を持ちたいと思っていますが、脚を持つ必要はありません。 –

+2

これはユーザーがカスタマイズできるページの一部です。ちょうどよい猫の尾が必要です。 – I159

+0

十分に公正で、合理的な使用例です。ちょうどあなたをチェックすることは、ひどく乱された出力を作り出そうとしていませんでした。 –

答えて

1

うわー、html5libには恐ろしい文書があります。ソースを通してみると、簡単なテストケースでの作業

、これは動作するように表示されます。

import html5lib 
from html5lib import treebuilders 
parser = html5lib.HTMLParser(tree=treebuilders.getTreeBuilder("simpleTree")) 
with open('test.html') as test: 
    doc = parser.parse(test) 
    for child in doc: 
     if child.parent.name == "body": 
      return child.toxml() 

それは少しハックだが、それほどreplace()より。

1

lxmlは、「珍しい」htmlを扱う場合は、より良い選択です。

2

我々が文字列/ unicodeにタグ/スープを鋳造する際に「エクスポート」されることから、タグ自体を防ぐためにTag秒のhiddenプロパティを使用することができるようです:

基本的に
>>> from bs4 import BeautifulSoup 
>>> html = u"<div><footer><h3>foot</h3></footer></div><div>foo</div>" 
>>> soup = BeautifulSoup(html, "html5lib") 
>>> print soup.body.prettify() 
<body> 
<div> 
    <footer> 
    <h3> 
    foot 
    </h3> 
    </footer> 
</div> 
<div> 
    foo 
</div> 
</body> 

、質問者さん目標は、<body>ラッパー自体なしでbodyタグの内容全体を取得することです。これは動作します:

>>> soup.body.hidden=True 
>>> print soup.body.prettify() 
<div> 
    <footer> 
    <h3> 
    foot 
    </h3> 
    </footer> 
</div> 
<div> 
    foo 
</div> 

私はBeautifulSoupソースを介してこれを見つけました。 soup = BeautifulSoup(html)を呼び出した後、ルートタグの内部名は「[document]」になります。デフォルトでは、ルートタグのみがhidden==Trueです。これにより、その名前がHTML出力で終わるのを防ぐことができます。

関連する問題