如何替换lxml中的元素?

时间:2015-05-28 19:50:19

标签: python lxml elementtree lxml.html

我有一个文本(由CRM用户输入的数据)Web服务,它返回一个"可怕的格式"。我在使用数据之前使用python进行过滤,但是当涉及到删除换行符(br)时,我也删除了文本。代码如下:

description = '''
<div id="highlight" class="section">
    <p>
        text...............
    </p>
    <br>
    <h1>TITLE</h1>
    <p>Multiple text
        <br>&nbsp;
    </p>
    <ul>
        <li>bad layer....</li>
    </ul>
    <p>
        <br>subTitle
    </p>
    <p>&nbsp;</p>
    <p style="text-align: center;">
        <br>Text1
        <br>Text2
        <br>Text3
        <br>Text4
        <br>Text5
        <br>Text6
    </p>
    <p style="text-align: center;">
        <strong>small title</strong>
        <br>Text small</p>
    <p style="text-align: center;">
        <strong>highlighted text</strong>
        <br>
        <br><strong>Text1</strong>
        <br>Text2
        <br>Text3
        <br>Text4
    </p>
    <p style="text-align: center;">
        <strong>small text</strong>
        <br>Text1
        <br>Text2
    </p>
    <p style="text-align: center;">
        <strong>small text</strong>
        <br>description
    </p>
    <p style="text-align: center;">
        <br>&nbsp;</p>
    <p><strong>description two</strong></p>
    <p>
        <br>&nbsp;</p>
</div>
'''

tree = html.fragment_fromstring( description )

for element in tree.xpath('//br'):
    #element.getparent().remove(element)
    print element.text
    print element.getparent().getchildren()
    #print element
    #print element.getparent()
    #print element.getchildren()
    #print element.getnext()
    #print '--------------------------------'

我试图用element.getparent()。remove(element)删除 br ,但也删除了文本,我做了测试,看看文本是否属于任何节点,但不是如此。

我已经考虑过用li改变br了,用ul来制作带有stylo的p,但我不能这样想,就像这样(之前的文字蹩脚):

..........
..........
<ul>
    <li>Text1</li>
    <li>Text2</li>
    <li>Text3</li>
    <li>Text4</li>
    <li>Text5</li>
    <li>Text6</li>
</ul>
<ul>
    <li><strong>small title</strong></li>
    <li>Text small</li></ul>
<ul>
    <li><strong>highlighted text</strong></li>
    <li><strong>Text1</strong></li>
    <li>Text2</li>
    <li>Text3</li>
    <li>Text4</li>
</ul>
<ul>
    <li><strong>small text</strong></li>
    <li>Text1</li>
    <li>Text2</li>
</ul>
<ul>
    <li><strong>small text</strong></li>
    <li>description</li>
</ul>
<ul>
    <li>&nbsp;</li></ul>
........

我不能认为是采取文本,因为我认为只选择节点p的xpath和样式及其值,创建li的子节点和父节点ul,消除p。

有可能吗?感谢

此致

1 个答案:

答案 0 :(得分:1)

您可以使用lxml.etree.strip_elements,如下所示:

from  lxml import html
from lxml import etree

tree = html.fragment_fromstring( description )
etree.strip_elements(tree, 'br', with_tail=False)

print etree.tostring(tree,pretty_print=True)