从Python

时间:2018-03-23 11:43:51

标签: python

我需要在“文本”级别的HTML文件中进行一些替换,也就是说,我不能使用HTML解析器,因为我没有使用标记。

例如,我需要将var hls = new Hls(config);替换为

            var config = {
                xhrSetup: function(xhr, url){
                    xhr.withCredentials = true;
                }
            }
            var hls = new Hls(config);

我发现replace函数在匹配多行字符串(如</script>\n</body>时)会考虑空格,例如在</script>

之前添加一些内容
    </script>
  </body>
</html>

我需要replace('</script>\n </body>', 'alert(1);\n</script>\n</body>')

由于我将使用不同的文件,有些可能使用2个字符缩进,其他4个...我有兴趣删除所有前导空格,以便之前的片段变为:

var config = {
xhrSetup: function(xhr, url){
xhr.withCredentials = true;
}
}
var hls = new Hls(config);

</script>
</body>
</html>

那么,独立于文件,我可以replace('</script>\n</body>', 'alert(1);\n</script>\n</body>')

我尝试使用lstrip(),但似乎没有做任何事情。那就是:

with open('web.html') as web_page:
    web = web_page.read()
    print(web.lstrip())

不会删除前导空格。 replace(' ', '')不是一个选项,因为它会破坏代码(例如varconfig={)。

TL; DR; 如何阅读Web文件并删除Python中的所有前导空格?

2 个答案:

答案 0 :(得分:2)

您的代码的问题在于您read整个HTML文件和lstrip整个事情,即您只剥离第一行(可能没有任何缩进)。

相反,您必须单独读取行或在阅读后拆分行,然后将lstrip应用于每一行。

for line in web_page: # read file one line at a time
    print(line.lstrip())

# read file en block, but split lines afterwards
print("\n".join(map(str.lstrip, web.splitlines())))

或者使用正则表达式^\s+作为&#34;行开头处的空格&#34;:

import re
print(re.sub(r"^\s+", "", web, flags=re.M))

但是,除了删除前导空格之外,您还可以使用正则表达式进行实际替换,使用\s*表示任意数量的空格,并\1重新插入匹配的确切文本,包括原始的空白。

print(re.sub(r"(</script>\s*</body>)", r"alert(1);\1", web, flags=re.M))

答案 1 :(得分:-2)

看一下苗条的图书馆: https://pypi.python.org/pypi/slimmer/

  

slimmer.py是CSS,HTML和XHTML输出的空白优化器。