簡體   English   中英

Python:使用“lxml.html”將 HTML 內容注入標簽

[英]Python: Injecting HTML content into a tag using `lxml.html`

我正在使用lxml.html庫來解析 HTML 文檔。

我找到了一個特定的標簽,我稱之為content_tag ,我想更改它的內容(即<div></div>之間的文本),新內容是一個帶有一些 html 的字符串,說它是'Hello <b>world!</b>'

我怎么做? 我嘗試了content_tag.text = 'Hello <b>world!</b>'但隨后它轉義了所有 html 標簽,將<替換為&lt; 等等

我想注入沒有escaping 任何 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>

另見: 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)

再次編輯:這個版本刪除了文本和子項

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)

經過一番折騰,我找到了這個解決方案:

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

假設 content_tag 沒有任何子元素,您可以這樣做:

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

...

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM