我有一些像这样的html代码
<body>
<p> String </p>
Some string
</body>
Run Code Online (Sandbox Code Playgroud)
我需要用一个段落将所有展开的文本包装在正文中。我可以使用 javascript Node.nodeTypes 来完成此操作,但我需要 Python 上的解决方案(我尝试使用 lxml)。
在输出中我需要
<body>
<p> String </p>
<p> Some string </p>
</body>
Run Code Online (Sandbox Code Playgroud)
我的javascript解决方案
<body>
<p> String </p>
Some string
</body>
Run Code Online (Sandbox Code Playgroud)
<body>
<p> String </p>
<p> Some string </p>
</body>
Run Code Online (Sandbox Code Playgroud)
以下是使用 lxml 完成此操作的方法:
html = '''
<html>
<body>
Text
<p>String</p>
Tail
<p>String</p>
Tail
</body>
</html>
'''
from lxml import etree
import lxml.html
doc = lxml.html.fromstring(html)
for doc_child in doc:
if doc_child.tag == 'body':
body = doc_child
if body.text and body.text.strip():
p = etree.Element('p')
p.text = body.text.strip()
body.text = None
body.insert(0, p)
for elem in body:
if elem.tail and elem.tail.strip():
p = etree.Element('p')
p.text = elem.tail.strip()
elem.tail = None
elem.addnext(p)
print(lxml.html.tostring(doc).decode('utf8'))
Run Code Online (Sandbox Code Playgroud)
输出:
<html>
<body><p>Text</p><p>String</p><p>Tail</p><p>String</p><p>Tail</p></body>
</html>
Run Code Online (Sandbox Code Playgroud)