2017-12-21 2 views
-1

여러 줄을 제거해야하는 곳에 여러 개의 HTML 파일이 있습니다.파일에서 여러 줄을 제거하십시오.

제거해야하는 줄에는 스크립트 태그를 제외하고 처음과 끝에 키워드가 없지만이 파일에서 모든 스크립트 태그를 제거하지 않으려합니다.

내가 제거하는 데 필요한 HTML 부분의 예 : 어떻게하면

<script type="text/javascript"> 
var _gaq = _gaq || []; 
_gaq.push(['_setAccount', 'UA-XXXXXXXX-X']); 
_gaq.push(['_trackPageview']); 
(function() { 
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; 
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; 
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); 
})(); 
</script> 

당신이 그것을 할 수 있다고 생각하고 있습니까?

업데이트 나는 아래 @ARJMP 솔루션에 일부 수정을했다,하지만 정규식에 분석 태그를 제거하지 않고 같은 파일을 다시 반환합니다.

정규식은 https://regex101.com/r/rWLZRD/1

@ARJMP 왜 정규식이 차감되지가 맞습니까? 정규식이이 문제를 해결하는 데 사용할 수 있습니다 당신의 아주 간단한 사용 사례 고려,이 작업을 수행하는 가장 좋은 방법은 아니지만

import re 
from collections import defaultdict 

ga_re = r"<script type=\"text\/javascript\">\s+var _gaq = _gaq .*</script>" # our regex to subtract google analytics script 
file_texts = defaultdict(str) # Temp store for file text 
file_paths = ['index.html'] # list of files you want to run 

for file_path in file_paths: 
    with open(file_path, mode='r+') as fin: 
     # Extract text from file 
     file_text = ''.join(fin.readlines()) 
     file_texts[file_path] = file_text 

     # Write to backup file 
     with open('{}.backup'.format(file_path), mode='w+') as fbackup: 
      fbackup.write(file_text) 
    with open(file_path, mode='w+') as fout: 
     # Perform regex sub and write to file 
     file_text = file_texts[file_path] 
     file_text_result = re.sub(ga_re, '', file_text, re.DOTALL) 
     fout.write(file_text_result) 
+0

다른 방법으로 어떤 선을 제거해야하는지 설명해 주시겠습니까? 예를 들어 잘 적용될 수 있습니까? – mattjegan

+2

삭제하려는 선을 어떻게 구체적으로 선택 하시겠습니까? 이미 그것에 대해 어떻게 생각해 봤습니까? – SCB

+0

[Beautiful Soup] (https://www.crummy.com/software/BeautifulSoup/bs4/doc/)와 같은 HTML 작업 도구를 사용하고 싶을 것입니다. – Ryan

답변

1

여기, 정규식 솔루션입니다. 당신은 또한 여러 파일에 대해이 작업을 수행 할 필요가 있으므로

var _gaq = _gaq 다음에 스크립트 태그를 확인 정규식 및 </script>

https://regex101.com/r/rWLZRD/1

import re 

regex = r"<script type=\"text\/javascript\">\s+var _gaq = _gaq .*</script>" 

test_str = ("<script type=\"text/javascript\">\n" 
    "var _gaq = _gaq || [];\n" 
    "_gaq.push(['_setAccount', 'UA-XXXXXXXX-X']);\n" 
    "_gaq.push(['_trackPageview']);\n" 
    "(function() {\n" 
    "var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;\n" 
    "ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';\n" 
    "var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);\n" 
    "})();\n" 
    "</script>") 

matches = re.sub(regex, test_str, re.DOTALL) 

확인 내용의 요소를 선두로 끝나는, 어떤 당신을 파일 목록을 반복하고 정규식을 적용하는 스크립트로 할 수 있습니다. 이 스크립트는 원본 파일을 수정하기 때문에 {file} .backup 파일도 생성합니다.

import re 
from collections import defaultdict 

ga_re = r"<script type=\"text\/javascript\">\s+var _gaq = _gaq .*</script>" # our regex to subtract google analytics script 
file_texts = defaultdict(str) # Temp store for file text 
file_paths = ['first_file.html', 'second_file.html'] # list of files you want to run 

for file_path in file_paths: 
    with open(file_path, mode='r') as f: 
     # Extract text from file 
     file_text = ''.join(f.readlines()) 
     file_texts[file_path] = file_text 

     # Write to backup file 
     with open('{}.backup'.format(file_path), mode='w+') as fbackup: 
      fbackup.write(file_text) 
    with open(file_path, mode='w+'): 
     # Perform regex sub and write to file 
     file_text = file_texts[file_path] 
     file_text_result = re.sub(ga_re, file_text, re.DOTALL) 
     f.write(file_text_result) 

즉,이 범위를 벗어나는 그러나 당신은 또한 등, 백업을 만들고, 명령 행에서 파일 이름의 목록을 받아 들일 수있는 명령 줄 스크립트를 만들기 위해 argparse 같은 것을 사용 만들 수있는 옵션을 제공하거나 없습니다 대답.

+0

'추적 (가장 최근 통화) : 파일 'google_analytics.평 ", file_texts 라인 (5) = defaultdict ('') # 임시 저장 파일의 텍스트를 형식 오류 :. 첫 번째 인수는 호출해야 또는 None' 이 defaultdict 이전에 사용하지 마십시오과이 동작하지 않습니다 – Fusecube

+0

죄송합니다, 그것은'file_texts = defaultdict (str)'이어야만합니다. 아마도 defaultdict가 필요하지 않고 원하는 경우 일반 dict을 대신 사용할 수 있습니다. – ARJMP

+0

위의 업데이트를 추가했습니다. – Fusecube

관련 문제