2013-07-10 88 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>