如何使用python删除<script>和</script>之间的文本?

时间:2009-06-08 11:30:28

标签: javascript python

如何使用python删除<script></script>之间的文本?

9 个答案:

答案 0 :(得分:25)

您可以对此(和其他)方法使用BeautifulSoup

soup = BeautifulSoup(source.lower())
to_extract = soup.findAll('script')
for item in to_extract:
    item.extract()

这实际上从HTML中删除了节点。如果您想保留空<script></script>标签,则必须使用item属性,而不是仅仅从汤中提取它。

答案 1 :(得分:5)

您是否试图阻止XSS?只是删除<script>标签并不能解决所有可能的攻击!这里列出了很多可能容易受到攻击的方法(其中一些非常有创意)http://ha.ckers.org/xss.html。阅读本页后,您应该了解为什么只使用正则表达式来删除<script>标记不够健壮。 python库lxml有一个功能,可以强大地清理HTML,使其安全显示。

如果您确定要删除<script>标记,则lxml中的此代码应该有效:

from lxml.html import parse

root = parse(filename_or_url).getroot()
for element in root.iter("script"):
    element.drop_tree()

注意:我使用常规表达式对所有解决方案进行了投票。请参阅此处为什么不应使用正则表达式解析HTML:Using regular expressions to parse HTML: why not?

注2:另一个SO问题,显示无法使用正则表达式解析HTML:Can you provide some examples of why it is hard to parse XML and HTML with a regex?

答案 2 :(得分:0)

您可以使用HTMLParser模块(复杂)或使用正则表达式执行此操作:

import re
content = "asdf <script> bla </script> end"
x=re.search("<script>.*?</script>", content, re.DOTALL)
span = x.span() # gives (5, 27)

stripped_content = content[:span[0]] + content[span[1]:]

编辑:re.DOTALL,感谢tgray

答案 3 :(得分:0)

如果要删除<script></script>之间的所有内容,为什么不删除整个节点?

你期待一个resig风格的src和body?

答案 4 :(得分:0)

根据Pev和wr发布的答案,为什么不升级正则表达式,例如:

pattern = r"(?is)<script[^>]*>(.*?)</script>"
text = """<script>foo bar  
baz bar foo  </script>"""
re.sub(pattern, '', text)

(?is) - 添加以忽略大小写并允许文本中的新行。此版本还应支持具有属性的脚本标记。

编辑:我还不能添加任何评论,所以我只是编辑我的答案。我完全同意下面的评论,正则表达式对于此类任务是完全错误的。汤ot lxml好多了。但问题只是一个简单的例子,正则表达式应该足以完成这么简单的任务。使用Beautiful Soup进行简单的文本删除可能会过多(过载?我不知道如何表达我的意思,请原谅我的英语)。

BTW我犯了一个错误,代码应该是这样的:

pattern = r"(?is)(<script[^>]*>)(.*?)(</script>)"
text = """<script>foo bar  
baz bar foo  </script>"""
re.sub(pattern, '\1\3', text)

答案 5 :(得分:0)

Element Tree是最简单,最甜蜜的套餐。是的,还有其他方法可以做到这一点;但不要使用任何'因为他们吮吸! (通过Mark Pilgrim)

答案 6 :(得分:-1)

我不知道Python足以告诉你一个解决方案。但是如果你想用它来消毒用户输入,你必须非常非常小心。删除之间的东西,只是没有抓住一切。也许你可以看看现有的解决方案(我假设Django包含这样的东西)。

答案 7 :(得分:-1)

example_text = "This is some text <script> blah blah blah </script> this is some more text."

import re
myre = re.compile("(^.*)<script>(.*)</script>(.*$)")
result = myre.match(example_text)
result.groups()
  <52> ('This is some text ', ' blah blah blah ', ' this is some more text.')

# Text between <script> .. </script>
result.group(2)
  <56> 'blah blah blah'

# Text outside of <script> .. </script>
result.group(1)+result.group(3)
  <57> 'This is some text  this is some more text.'

答案 8 :(得分:-1)

如果您不想导入任何模块:

string = "<script> this is some js. begone! </script>"

string = string.split(' ')

for i, s in enumerate(string):
    if s == '<script>' or s == '</script>' :
        del string[i]

print ' '.join(string)