在元素LXML中换行文本

时间:2017-05-27 09:50:40

标签: python lxml

我有像这样的HTML代码

<body>
  <p> String </p>
  Some string
</body>

我需要用一个段落将所有未打开的文本包装在一个正文中。 我可以用javascript Node.nodeTypes来做,但我需要Python上的解决方案(我尝试使用lxml)。

在输出中我需要

   <body>
      <p> String </p>
      <p> Some string </p>
    </body>

我在javascript上的解决方案

&#13;
&#13;
$(document).ready(function() {
  $('article').contents().filter(function() {
    return this.nodeType == 3 && $.trim(this.nodeValue).length;
  }).wrap('</p>');
})
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<article>
  <p>Some text</p>
  Some unwrapped text
  <p>Some text</p>
</article>
&#13;
&#13;
&#13;

3 个答案:

答案 0 :(得分:2)

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

输出:

<html>
<body><p>Text</p><p>String</p><p>Tail</p><p>String</p><p>Tail</p></body>
</html>

答案 1 :(得分:1)

  • 您可以使用BeautifulSoup模块来解析html页面。
  • 有很多方法可以做到这一点。

但这是将html解析为文本的最简单方法之一。

from bs4 import BeautifulSoup # from BeautifulSoup import BeautifulSoup
html = '''<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<article>
  <p>Some text</p>
  Some unwrapped text
  <p>Some text</p>
</article>'''
parsed_html = BeautifulSoup(html, "lxml")
print parsed_html.text

输出:

Some text
Some unwrapped text
Some text

答案 2 :(得分:0)

Python,带有lxml

from lxml.etree import fromstring
body = fromstring("""
    <body>
      <p> String </p>
      Some string
    </body>
""")
for text_node in body.xpath("//text()"):
    parent = text_node.getparent()
    if text_node.strip() and parent.tag != "p":
        wrapper = fromstring("<p/>")
        parent.replace(text_node, wrapper)
        wrapper.append(text_node)