如何使用python删除<script>
和</script>
之间的文本?
答案 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)