如何用美丽的汤将<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)
答案 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,同时保持内容。