在元素 LXML 内换行文本

nue*_*ueq 2 python lxml

我有一些像这样的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)

Kir*_*gin 5

以下是使用 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)