2013-07-10 82 views
1

我希望能够基于它的id包装div。例如,给定下面的HTML:使用python函数包装html

<body> 
    <div id="info"> 
     <div id="a1"> 
     </div> 
     <div id="a2"> 
      <div id="description"> 
      </div> 
      <div id="links"> 
       <a href="http://example.com">link</a> 
      </div> 
     </div> 
    </div> 
</body> 

我想写一个Python函数,它接受一个文件,一个id,和选择。并且将给定的id包装在给定document中的div中,类别或编号为selector。例如,可以说,上面的HTML是一个变量doc

wrap(doc,'#a2','#wrapped') 

将返回以下HTML:

<body> 
    <div id="info"> 
     <div id="a1"> 
     </div> 
     <div id="wrapped"> 
      <div id="a2"> 
       <div id="description"> 
       </div> 
       <div id="links"> 
        <a href="http://example.com">link</a> 
       </div> 
      </div> 
     </div> 
    </div> 
</body> 

我看了一些XML解析器和Python的HTMLParser,但我没有发现任何东西这使我不仅能够获取特定标签内的所有内容,还能够附加字符串并轻松编辑文档。如果一个人不存在,那么对此有什么好的方法?

+2

您是否尝试过'BeautifulSoup'? – zhangyangyu

+0

是啊,BeautifulSoup岩石! – ElmoVanKielmo

+0

我宁愿不使用BeautifulSoup,因为它只是在我正在编写的模块中的一个快速的东西,我不想导入这样大小的东西,我甚至不知道如何去做这件事beautifulSoup,但如果真的没有别的办法,我会检查一下 –

回答

2
from BeautifulSoup import BeautifulSoup 

#div1 is to be wrapped with div2 
def wrap(doc,div1_id,div2_id) 
    pool = BeautifulSoup(doc) 
    for div in pool.findAll('div', attrs={'id':div1_id}): 
     div.replaceWith('<div id='+div2_id+'>' + div.prettify() + '</div>') 
    return pool.prettify() 

wrap(doc,'a2','wrapped') 
1

我推荐BeautifulSoup虽然它会带来一些依赖性,但也很方便。下面的代码可以acheieve的wrap的目标:

from bs4 import BeautifulSoup 
    data = '''<body> 
       <div id="info"> 
        <div id="a1"> 
        </div> 
        <div id="a2"> 
        <div id="description"> 
        </div> 
        <div id="links"> 
         <a href="http://example.com">link</a> 
        </div> 
        </div> 
       </div> 
       </body>''' 
    soup = BeautifulSoup(data) 
    div = soup.find('div', attrs={'id': 'a2'}) 
    div.wrap(soup.new_tag('div', id='wrapper')) 

然后print soup.prettify()我们可以看到结果:

<html> 
<body> 
    <div id="info"> 
    <div id="a1"> 
    </div> 
    <div id="wrapper"> 
    <div id="a2"> 
    <div id="description"> 
    </div> 
    <div id="links"> 
     <a href="http://example.com"> 
     link 
     </a> 
    </div> 
    </div> 
    </div> 
    </div> 
</body> 
</html>