1

我希望能够根据它的 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 和一个选择器。并将用 class 或 id将给定id的给定包装document在 a中。例如,假设上面的 HTML 在一个变量中divselectordoc

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,但我没有找到任何能够让我不仅能够将所有内容包含在特定标记中,而且能够附加字符串并轻松编辑文档的能力。如果一个不存在,那么有什么好的方法呢?

4

2 回答 2

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')
于 2013-07-10T09:27:45.363 回答
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>
于 2013-07-10T07:53:48.580 回答