2015-09-16 30 views
3

我所擁有的是:如何將JavaScript插入<script/>元素?

from lxml import etree 
myscript = "if(0 < 1){alert(\"Hello World!\");}" 
html = etree.fromstring("<script></script>") 

for element in html.findall('//script'): 
    element.text = myscript 

result = etree.tostring(html) 

我得到的是:

>>> result 
'<script>if(0 &lt; 1){alert("Hello World!");}</script>' 

我要的是轉義的JavaScript:

>>> result 
'<script>if(0 < 1){alert("Hello World!");}</script>' 

回答

1

你不能。 lxml.etreeElementTree是XML解析器,所以無論你想解析或創建它們,都必須是有效的XML。並且在某些節點文本中未轉義的<不是有效的XML。它是有效的HTML,但不是有效的XML。

這就是爲什麼在XHTML中,您通常必須在<script>標籤內添加CDATA塊,因此您可以將放入其中而無需擔心有效的XML結構。

但在你的情況下,你只是想生成HTML,爲此,你應該使用HTML解析器。例如BeautifulSoup

>>> from bs4 import BeautifulSoup 
>>> soup = BeautifulSoup('<script></script>') 
>>> soup.find('script').string = 'if(0 < 1){alert("Hello World!");}' 
>>> str(soup) 
'<script>if(0 < 1){alert("Hello World!");}</script>' 
+0

不是不禮貌,但我相信在技術上你*可以*使用'lxml'解析

1

爲什麼你的方法失敗,是因爲你想改變「文本」元素的內容,而您需要更改/插入/追加了自己的元素原因見這個樣本:

In [1]: from lxml import html 

In [2]: myscript = "<script>if(0 < 1){alert(\"Hello World!\");}</script>" 

In [3]: template = html.fromstring("<script></script>") 

# just a quick hack to get the <script> element without <html> <head> 
In [4]: script_element = html.fromstring(myscript).xpath("//script")[0] 

# insert new element then remove the old one 
In [10]: for element in template.xpath("//script"): 
    ....:  element.getparent().insert(0, script_element) 
    ....:  element.getparent().remove(element) 
    ....: 

In [11]: print html.tostring(template) 
<html><head><script>if(0 < 1){alert("Hello World!");}</script></head></html> 

所以,是的,你仍然可以在技術上使用LXML插入元素。 而且我建議使用lxml.html而不是etree,因爲html對html元素更友好。