Как я могу определить, можно ли изменить это слово ... скрипт Python - PullRequest
0 голосов
/ 27 октября 2010

Цель - прочитать html-файлы и изменить все экземпляры MyWord на Myword;за исключением того, что НЕ следует изменять слово, если оно найдено внутри или как часть пути, имени файла или сценария:

href="..."
src="..."
url(...)
class="..."
id="..."
script inline or linked (file name) --> <script ...></script>
styles inline or linked (file name) --> <link ...>   <style></style>  

Теперь вопрос по всем вопросам: как определить, является ли экземпляр слованаходится в состоянии, где это можно изменить?(или, как вы определяете, находится ли слово внутри одного из перечисленных выше мест и не должно быть изменено?)

Вот мой код, его можно изменить на чтение построчно и т. д., ноЯ просто не могу придумать, как определить и применить правило для соответствия выше ...

Вот оно:

#!/usr/bin/python

import os
import time
from stat import *

def fileExtension(s):
   i = s.rfind('.')
   if i == -1:
      return ''
   tmp = '|' + s[i+1:] + '|'
   return tmp

def changeFiles():
   # get all files in current directory with desired extension
   files = [f for f in os.listdir('.') if extStr.find(fileExtension(f)) != -1]

   for f in files:
      if os.path.isdir(f):
         continue

      st = os.stat(f)
      atime = st[ST_ATIME] # org access time
      mtime = st[ST_MTIME] # org modification time

      fw = open(f, 'r+')
      tmp = fw.read().replace(oldStr, newStr)
      fw.seek(0)
      fw.write(tmp)
      fw.close()

      # put file timestamp back to org timestamp
      os.utime(f,(atime,mtime))

      # if we want to check subdirectories
      if checkSubDirs :
         dirs = [d for d in os.listdir('.') if os.path.isdir(d)]

      for d in dirs :
         os.chdir(d)
         changeFiles()
         os.chdir('..')

# ==============================================================================
# ==================================== MAIN ====================================

oldStr = 'MyWord'
newStr = 'Myword'
extStr = '|html|htm|'
checkSubDirs = True

changeFiles()  

Кто-нибудь знает как?Есть предложения?ЛЮБАЯ помощь приветствуется, бьёт мне мозг уже 2 дня и просто ничего не может придумать.

Ответы [ 2 ]

1 голос
/ 21 января 2011

lxml помогает при выполнении такого рода задач.

html = """
<html>
<body>
    <h1>MyWord</h1>
    <a href="http://MyWord">MyWord</a>
    <img src="images/MyWord.png"/>
    <div class="MyWord">
        <p>MyWord!</p>
        MyWord
    </div>
    MyWord
</body><!-- MyWord -->
</html>
"""

import lxml.etree as etree

tree = etree.fromstring(html)
for elem in tree.iter():
    if elem.text:
        elem.text = re.sub(r'MyWord', 'Myword', elem.text)
    if elem.tail:
        elem.tail = re.sub(r'MyWord', 'Myword', elem.tail)

print etree.tostring(tree)

Это напечатано выше:

<html>
<body>
    <h1>Myword</h1>
    <a href="http://MyWord">Myword</a>
    <img src="images/MyWord.png"/>
    <div class="MyWord">
        <p>Myword!</p>
        Myword
    </div>
    Myword
</body><!-- Myword -->
</html>

Примечание : вам нужно будет немного усложнить приведенный выше код, если вам также понадобится специальная обработка содержимого тегов сценария, например:

<script>
    var title = "MyWord"; // this should change to "Myword"
    var hoverImage = "images/MyWord-hover.png"; // this should not change
</script>
0 голосов
/ 27 октября 2010

Используйте регулярное выражение, вот пример, с которого вы можете начать, надеюсь, это поможет:

import re

html = """
    <href="MyWord" />
    MyWord
"""

re.sub(r'(?<!href=")MyWord', 'myword', html)
output: \n\n <href="MyWord" />\n myword\n\n

ref: http://docs.python.org/library/re.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...