Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何删除<;脚本>;及</脚本>;使用python?_Javascript_Python - Fatal编程技术网

Javascript 如何删除<;脚本>;及</脚本>;使用python?

Javascript 如何删除<;脚本>;及</脚本>;使用python?,javascript,python,Javascript,Python,如何使用python删除和之间的文本?您可以使用模块(复杂)或使用正则表达式执行此操作: 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]] +

如何使用python删除
之间的文本?

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

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]:]
重新导入
content=“asdf bla end”
x=re.search(“*”,内容,re.DOTALL)
span=x.span()给出了(5,27)
内容=内容[:span[0]]+内容[span[1]:]

编辑:re.DOTALL,多亏了tgray,我对Python的了解还不足以告诉您解决方案。但是如果你想用它来清理用户输入,你必须非常非常小心。删除和之间的内容并不能捕获所有内容。也许您可以看看现有的解决方案(我假设Django包括类似的解决方案)。

您可以使用以下(和其他)方法:


这实际上会从HTML中删除节点。如果要保留空的
标记,则必须使用
项的
属性,而不仅仅是从汤中提取它。

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

您是否希望使用resig样式的src和body?

example_text=“这是一些文本废话废话,这是更多的文本。”
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.'
进口稀土 myre=re.compile((^.*)(.*)(.*)(.$)) 结果=myre.match(示例\u文本) 结果.分组() (‘这是一些文字’、‘诸如此类’、‘这是更多的文字’) #文本介于。。 结果:第一组(2) “废话废话” #在..之外的文本。。 结果组(1)+结果组(3) “这是一些文本,这是更多的文本。”
如果您不想导入任何模块:

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)
string=“这是一些js.begone!”
string=string.split(“”)
对于枚举中的i,s(字符串):
如果s==''或s=='':
del string[i]
打印“”。连接(字符串)

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

pattern = r"(?is)<script[^>]*>(.*?)</script>"
text = """<script>foo bar  
baz bar foo  </script>"""
re.sub(pattern, '', text)
pattern=r“(?is)]*>(*?)
text=“”foo-bar
巴兹巴富酒店
re.sub(模式、文本)
(?is)-添加以忽略大小写并允许文本中出现新行。此版本还应支持带有属性的脚本标记

编辑:我还不能添加任何评论,所以我只是编辑我的答案。我完全同意下面的评论,regexp对于这样的任务是完全错误的。lxml的汤要好得多。但这个问题只给出了一个简单的例子,regexp应该足以完成这样简单的任务。使用BeautifulSoup删除简单的文本可能太多(过载?我不知道如何表达我的意思,请原谅我的英语)

顺便说一句,我犯了一个错误,代码应该如下所示:

pattern = r"(?is)(<script[^>]*>)(.*?)(</script>)"
text = """<script>foo bar  
baz bar foo  </script>"""
re.sub(pattern, '\1\3', text)
pattern=r“(?is)(]*>)(.*)”
text=“”foo-bar
巴兹巴富酒店
re.sub(模式“\1\3”,文本)
您是否试图阻止?仅仅删除
标签并不能解决所有可能的攻击!这里有一个很好的列表,列出了你可能容易受到攻击的许多方法(其中一些方法非常有创意)。阅读本页后,您应该理解为什么仅仅使用正则表达式删除
标记不够健壮。python库有一个函数,该函数将有力地清理HTML,使其能够安全地显示

如果您确定您只想消除
标记,那么lxml中的此代码应该可以工作:

from lxml.html import parse

root = parse(filename_or_url).getroot()
for element in root.iter("script"):
    element.drop_tree()
注意:我否决了所有使用常规表达式的解决方案。请参见为什么不应使用正则表达式解析HTML:


注2:另一个显示无法用正则表达式解析的HTML的问题:

是实现这一点的最简单、最甜蜜的软件包。是的,还有其他方法可以做到这一点;但不要使用任何“因为它们很烂!”!(通过Mark Pilgrim)

这有很多潜在问题,例如大小写、脚本标记是否具有属性、可能转义的文本片段等。很难可靠地涵盖所有选项,从而更容易使用现有的、经过测试的、,库,例如Beautiful Soup。您可能希望在搜索中添加re.DOTALL/re.S标志,以便“点”字符与换行符匹配。否则,您将无法匹配跨多行的脚本块(其中大多数是跨行的);这确实符合必要的规格。不it@becomingGuru请参阅我的解决方案中的两个链接,了解为什么使用正则表达式解析HTML是个坏主意。虽然这个anser可能满足问题的“规格”,但它存在严重的安全问题,并不是一个真正可靠的解决方案。请参阅来自“mavnn”和(点击submit太早)以及“DrJokepu”的注释,它们指出了相同的问题。请注意,这些注释将通过regexmyre=re.compile((^.*)(.*)(.*)(.$)来捕获它。再次,如何?var x='lol'怎么样;等等?他确实说了“和”。这是正确的答案。Niloy或任何阅读此问题的人,请忽略任何主张在本例中使用正则表达式的答案,因为它们都存在严重的、容易被利用的安全问题。我同意@DrJokepu。不要试图用正则表达式解析HTML!我无法让它工作,因为script标记之间的文本包含如下内容:var str=“”;BeautifulSoup认为这个字符串是一个标签。这已经有两年了,但我会尝试和评论@DrJokepu这将是一个好主意,但我无法将html加载到BeautifulSoup中,因为javascript中有错误的html标记,这会在解析器中引发错误。我需要先用正则表达式去掉javascript。从bs4导入如何?怎么样
from lxml.html import parse

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