用python函数包装html

时间:2013-07-10 07:09:58

标签: python html parsing

我希望能够根据它的id包装div。例如,给出以下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 个答案:

答案 0 :(得分: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 :(得分:1)

我推荐BeautifulSoup虽然它会带来一些依赖性但也很方便。以下代码可以实现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>