【问题标题】:wrapping html with a python function用python函数包装html
【发布时间】:2013-07-10 07:09:58
【问题描述】:

我希望能够根据它的 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 包装在div 中的给定document 中,类或id 为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,但我没有找到任何东西让我不仅能够将所有内容放入特定标签中,而且能够附加字符串并轻松编辑文档。如果不存在,有什么好的方法呢?

【问题讨论】:

  • 你试过BeautifulSoup吗?
  • 是的,BeautifulSoup 摇滚!
  • 我宁愿不为此使用 BeautifulSoup,因为它只是为了我正在编写的模块中的一件快速事情,我不想导入那么大的东西,我什至没有确定如何在 beautifulSoup 中解决这个问题,但如果真的没有其他方法,我会检查一下

标签: python html parsing


【解决方案1】:
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')

【讨论】:

    【解决方案2】:

    我推荐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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-02
      • 2012-03-10
      • 1970-01-01
      • 2018-10-12
      • 2018-08-23
      相关资源
      最近更新 更多