承前
lxmlの代わりに、Beautiful Soup(2013/01/02現在 Beautiful Soup 4.1.3)ならできるか、と試してみました。
XPathが使えないのが難点なんだけど…。
例
#! /usr/bin/env python # -*- coding: utf-8 -*- from bs4 import BeautifulSoup, NavigableString TEST_HTML=u""" <html> <head><title>TEST</title></head> <body> <div id="text"> 書き始め。 <p> 本文はここ。<br /> ここまでだけ残して、後は消したいの。 </p> <hr /> <!-- cutting line --> <p>ここから先は要らない</p> dust <b>ゴミ</b> 廃棄物<br /> unnecessary text </div> </body> </html> """ if __name__ == '__main__': soup = BeautifulSoup(TEST_HTML, 'lxml') hr = soup.find('div', id='text').find('hr') next_elm = hr.next_sibling ci = 1 while next_elm: print u'No.%2d' % (ci) tgt_elm = next_elm print tgt_elm next_elm = tgt_elm.next_sibling #if isinstance(tgt_elm, NavigableString): # # NavigableStringのサブクラス有り(Comment, CData, ProcessingInstruction, Declaration, Doctype) if hasattr(tgt_elm, 'decompose'): tgt_elm.decompose() else: tgt_elm.replace_with('') print u'='*50+u'\n' ci += 1 print u'■結果' print unicode(soup) print u'\n' print u'■結果 (整形後)' print soup.prettify() # ■ end of file
結果
No. 1 ================================================== No. 2 cutting line ================================================== No. 3 ================================================== No. 4 <p>ここから先は要らない</p> ================================================== No. 5 dust ================================================== No. 6 <b>ゴミ</b> ================================================== No. 7 廃棄物 ================================================== No. 8 <br/> ================================================== No. 9 unnecessary text ================================================== ■結果 <html><head><title>TEST</title></head><body> <div id="text"> 書き始め。 <p> 本文はここ。<br/> ここまでだけ残して、後は消したいの。 </p> <hr/></div> </body></html> ■結果 (整形後) <html> <head> <title> TEST </title> </head> <body> <div id="text"> 書き始め。 <p> 本文はここ。 <br/> ここまでだけ残して、後は消したいの。 </p> <hr/> </div> </body> </html>
一応、やりたいことは出来るのかな
テキストノードに相当するのが NavigableString で、これは他の要素(Tag付)みたいにTag.decompose()で消すことはできない模様。
ただ、Str.replace_with(<置換文字列>) で文字列を書き換えることは出来るので、引数に空文字('')を指定してやれば、実質的に消すことは出来る。
サゲ
というわけで、だれか、Beautiful Soup 4で XPath も使えるようにしてください(苦笑)。