Đây là một cách:
#!/usr/bin/env python2.6
from lxml.html import fromstring, tostring
from lxml.html import builder as E
fragment = """\
<div id="outer">
<div id="inner">This is div.</div>
</div>"""
div = fromstring(fragment)
print tostring(div)
# <div id="outer">
# <div id="inner">This is div.</div>
# </div>
div.replace(div.get_element_by_id('inner'), E.DIV('Hello ', E.B('world!')))
print tostring(div)
# <div id="outer">
# <div>Hello <b>world!</b></div></div>
Xem thêm: http://lxml.de/lxmlhtml.html#creating-html-with-the-e-factory
Edit: Vì vậy, tôi phải thú nhận trước đó rằng tôi không tất cả những gì quen thuộc với lxml. Tôi đã xem xét các tài liệu và nguồn một thời gian ngắn, nhưng không tìm thấy một giải pháp sạch. Có lẽ, một người quen thuộc hơn sẽ dừng lại và đặt chúng tôi cả hai thẳng.
Trong khi đó, điều này dường như để làm việc, nhưng cũng không phải là thử nghiệm:
import lxml.html
content_tag = lxml.html.fromstring('<div>Goodbye.</div>')
content_tag.text = '' # assumes only text to start
for elem in lxml.html.fragments_fromstring('Hello <b>world!</b>'):
if type(elem) == str: #but, only the first?
content_tag.text += elem
else:
content_tag.append(elem)
print lxml.html.tostring(content_tag)
Chỉnh sửa lần nữa: và phiên bản này loại bỏ văn bản và con
somehtml = 'Hello <b>world!</b>'
# purge element contents
content_tag.text = ''
for child in content_tag.getchildren():
content_tag.remove(child)
fragments = lxml.html.fragments_fromstring(somehtml)
if type(fragments[0]) == str:
content_tag.text = fragments.pop(0)
content_tag.extend(fragments)
Cách _nice_, vì bạn thực sự cố gắng sửa đổi cấu trúc DOM, sẽ thêm nút con mới cho 'world'. – katrielalex
Tôi làm như thế nào? –