【问题标题】:How to insert JavaScript into <script/> element?如何将 JavaScript 插入 <script/> 元素?
【发布时间】:2015-09-16 11:26:37
【问题描述】:

我拥有的是:

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>'

【问题讨论】:

    标签: javascript python escaping lxml elementtree


    【解决方案1】:

    您的方法失败的原因是您试图更改元素的“文本”内容,而您需要更改/插入/附加它自己的 Element,请参阅此示例:

    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 元素更友好。

    【讨论】:

      【解决方案2】:

      你不能。 lxml.etree 和 ElementTree 是 XML 解析器,因此无论您想用它们解析或创建什么,都必须是有效的 XML。并且某些节点文本中未转义的 &lt; 不是有效的 XML。它是有效的 HTML,但不是有效的 XML。

      这就是为什么在 XHTML 中,您通常必须在 &lt;script&gt; 标记内添加 CDATA 块,这样您就可以将 whatever 放在那里而不必担心有效的 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>'
      

      【讨论】:

      • 不是不礼貌,但我相信技术上您可以使用lxml 来解析
      • @Anzel 您自己在回答中使用了 HTML 解析器……您可以通过尝试解析输出文本轻松确认您无法使用 XML 解析器处理所需的输出文本。跨度>
      • OP 从未提到不要使用 HTML 解析器。主要问题是如何将 JS 插入到元素中。简而言之,它可以通过自行替换元素来实现。因为通常你不会在 XML 文件中收到 script 标签,所以使用 etree 的 OP 也是不合适的
      • @Anzel 请看我的回答?它本质上是说“你不能使用 XML 解析器,使用 HTML 解析器”,所以我真的不明白你想告诉我什么。
      • 我很困惑,lxml 不仅是一个 XML 解析器,它还是一个 HTML 解析器。 BeautifulSoup 也可以使用“lxml”作为解析器。
      猜你喜欢
      • 1970-01-01
      • 2011-02-16
      • 2023-02-02
      • 2020-06-06
      相关资源
      最近更新 更多