如何使用BeautifulSoup用div容器包装正文内容

时间:2013-12-26 19:01:15

标签: python beautifulsoup

如何用美丽的汤将<div data-role="content"></div>包裹在html正文的内容周围?

我尝试从以下开始,但未能取得任何进展:

    from bs4 import BeautifulSoup
    soup = BeautifulSoup(u"%s" % response)
    wrapper = soup.new_tag('div', **{"data-role":"content"})
    soup.body.append(wrapper)
    for content in soup.body.contents:
        wrapper.append(content)

我也尝试过使用body.children,但没有运气。

这会将包装器附加到正文,但不会像我需要的那样包裹正文内容

- 编辑 -

我已经到了这里,但现在我最终得到了像<body><div data-role="content"><body>content here</body></div></body>这样的重复身体元素

    from bs4 import BeautifulSoup
    soup = BeautifulSoup(u"%s" % response)
    wrapper = soup.new_tag('div', **{"data-role":"content"})
    new_body = soup.new_tag('body')
    contents = soup.body.replace_with(new_body)
    wrapper.append(contents)
    new_body.append(wrapper)

3 个答案:

答案 0 :(得分:4)

这个怎么样?

from bs4 import BeautifulSoup
soup = BeautifulSoup(unicode(response))
wrapper = soup.new_tag('div', **{"data-role":"content"})
body_children = list(soup.body.children)
soup.body.clear()
soup.body.append(wrapper)
for child in body_children:
    wrapper.append(child)

答案 1 :(得分:1)

BeautifulSoup wrap()的完美用例:

from bs4 import BeautifulSoup, Tag

response = """
<body>
    <p>test1</p>
    <p>test2</p>
</body>
"""

soup = BeautifulSoup(response, 'html.parser')

wrapper = soup.new_tag('div', **{"data-role": "content"})
soup.body.wrap(wrapper)

print soup.prettify()

打印:

<div data-role="content">
 <body>
  <p>
   test1
  </p>
  <p>
   test2
  </p>
 </body>
</div>

UPD:

from bs4 import BeautifulSoup

response = """<html>
<head>
    <title>test</title>
</head>
<body>
    <p>test</p>
</body>
</html>
"""

soup = BeautifulSoup(response)

wrapper = soup.new_tag('div', **{"data-role": "content"})
soup.body.wrap(wrapper)

print soup.prettify()

产生

<html>
 <head>
  <title>
   test
  </title>
 </head>
 <div data-role="content">
  <body>
   <p>
    test
   </p>
  </body>
 </div>
</html>

答案 2 :(得分:0)

我最近遇到了同样的情况,我对这里的任何其他答案都不满意。遍历大量列表并重建 DOM 在性能方面对我来说似乎是不可接受的,另一个解决方案包装主体,而不是主体的内容。这是我的解决方案:

soup.body.wrap(soup.new_tag("div", **{"data-role": "content"})).wrap(soup.new_tag("body"))
soup.body.body.unwrap()

很简单,这种方法只是将主体包装两次,首先是新标签,然后是另一个主体。然后我使用BeautifulSoup的unwrap方法删除原来的body,同时保持内容。