Python:使用`lxml.html`将HTML内容注入标记

Ram*_*hum 12 html python parsing lxml

我正在使用该lxml.html库来解析HTML文档.

我所在的特定的标签,我打电话content_tag了,我想改变它的内容(即之间的文本<div></div>,)和新的内容与它的一些HTML字符串,说这是'Hello <b>world!</b>'.

我怎么做?我试过content_tag.text = 'Hello <b>world!</b>'但它然后它逃脱了所有的html标签,取而代之<&lt;等等.

我想注入文本而不转义任何HTML.我怎样才能做到这一点?

Mar*_*rty 8

这是一种方式:

#!/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>
Run Code Online (Sandbox Code Playgroud)

另见:http://lxml.de/lxmlhtml.html#creating-html-with-the-e-factory

编辑:所以,我应该早些时候承认我并不熟悉lxml.我简要地查看了文档和来源,但没有找到一个干净的解决方案.或许,更熟悉的人会停下来,让我们两个都做好.

与此同时,这似乎有效,但尚未经过充分测试:

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)
Run Code Online (Sandbox Code Playgroud)

再次编辑:此版本删除文本和子项

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)
Run Code Online (Sandbox Code Playgroud)