Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:使用`lxml.HTML将HTML内容注入标记`_Python_Html_Parsing_Lxml - Fatal编程技术网

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

Python:使用`lxml.HTML将HTML内容注入标记`,python,html,parsing,lxml,Python,Html,Parsing,Lxml,我正在使用lxml.html库解析html文档 我找到了一个特定的标记,我称之为content\u标记,我想更改它的内容(即和,之间的文本),新内容是一个包含一些html的字符串,比如说'Hello world!' 我该怎么做?我试过content\u tag.text='Hello world!'但它会转义所有html标记,替换这是一种方法: #!/usr/bin/env python2.6 from lxml.html import fromstring, tostring from lxm

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

我找到了一个特定的标记,我称之为
content\u标记
,我想更改它的内容(即
,之间的文本),新内容是一个包含一些html的字符串,比如说
'Hello world!'

我该怎么做?我试过
content\u tag.text='Hello world!'但它会转义所有html标记,替换
这是一种方法:

#!/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>
#/usr/bin/env python2.6
从lxml.html导入fromstring,tostring
从lxml.html导入生成器作为E
片段=”“”\
我是迪夫。
"""
div=fromstring(片段)
打印到字符串(div)
# 
#我是迪夫。
# 
div.replace(div.get_元素由_id('inner')、E.div('Hello',E.B('world!'))替换)
打印到字符串(div)
# 
#你好,世界!
另见:

编辑:所以,我应该早点承认我对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)
import lxml.html
content\u tag=lxml.html.fromstring('再见')
content_tag.text=''#假定仅以文本开头
对于lxml.html.fragments\u fromstring('helloworld!')中的元素:
如果类型(elem)=str:#但是,只有第一个?
content_tag.text+=元素
其他:
内容标签附加(元素)
打印lxml.html.tostring(内容标签)
再次编辑:此版本将删除文本和子项

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)
somehtml='helloworld!'
#清除元素内容
content_tag.text=“”
对于content_tag.getchildren()中的子项:
内容标签。删除(子项)
fragments=lxml.html.fragments\u fromstring(somehtml)
如果类型(片段[0])==str:
content_tag.text=fragments.pop(0)
内容标签扩展(片段)

假设content\u标签没有任何子元素,您只需执行以下操作:

from lxml import html
from lxml.html.builder import B

...

content_tag.text = 'Hello '
content_tag.append(B('world!'))
print html.tostring(content_tag)

在进行修补之后,我找到了以下解决方案:

fragments = lxml.html.fragments_fromstring(<string with tags to inject>)
last = None

for frag in fragments:
  if isinstance(frag, lxml.etree._Element):
    content_tag.append(frag)
    last = frag
  else:
    if last:
      last.tail = frag
    else:
      content_tag.text = frag
fragments=lxml.html.fragments\u fromstring()
最后一个=无
对于碎片:
如果存在(框架,lxml.etree.\u元素):
内容标签附加(frag)
最后一个=碎片
其他:
如果最后:
last.tail=frag
其他:
content_tag.text=frag

由于您确实在尝试修改DOM结构,因此最好的方法是为
world
添加一个新的子节点。这种方法不适用于我,原因有两个:(1)我不想替换标记,我想替换标记的内容,(2)我想插入的html段已经是文本形式,我不想用
E
来构建它。这没用——我的HTML文本事先不知道,我无法在代码中将其构造为HTML结构。啊,但是您没有在问题中指定这一点(“事先不知道”部分)。mwalsh编辑的答案看起来不错,应该适用于任意HTML。