Share via


Чистка HTML созданного в MS Word

????-?? ?? ???? ?????... ?? ??... ???? ??????? ????????? ????, ????? ????????? ???????????? ? ????? HTML ???-?? ?????????? ? MS Word... ??? ??? ???? Save As Filtered HTML ?? ????????. ??, ?? ????????? ? ???? ??????????, ??? ????? ? ?????? ???????? ????? ?????? ????? ??? ??????

 <o:DocumentProperties>
  <o:Author>Eldar Musayev</o:Author>
  <o:Revision>4</o:Revision>
  <o:TotalTime>179</o:TotalTime>
  <o:Created>2008-06-03T05:31:00Z</o:Created>
  <o:LastSaved>2008-06-03T06:59:00Z</o:LastSaved>
  <o:Pages>1</o:Pages>
  <o:Words>1794</o:Words>
  <o:Characters>10226</o:Characters>
  <o:Company>Home</o:Company>
  <o:Lines>85</o:Lines>
  <o:Paragraphs>23</o:Paragraphs>
  <o:CharactersWithSpaces>11997</o:CharactersWithSpaces>
  <o:Version>11.9999</o:Version>
 </o:DocumentProperties>
 <o:OfficeDocumentSettings>
  <o:DoNotRelyOnCSS/>
  <o:DoNotOrganizeInFolder/>
 </o:OfficeDocumentSettings>
</xml><![endif]--><!--[if gte mso 9]><xml>

??? ???

<font size=5 color="#345a8a" face=Calibri><span lang=RU
style='font-size:16.0pt;mso-ansi-language:RU'>...<o:p></o:p></span></font> 

??????? ?????????? ?????????? ?? ?????. ???, ???????, ???????? ? ?????? ? ???????? ?? ?????????... ????? 60 ????? ??????????, ? HTML ?????????? ??????????, ??????????, ?????? ????????... ? ?????, ???? ???? - ???????????! ? ??, ??? ?????? ? ????????????? ?????...

import sys
import HTMLParser

class HtmlCleaner(HTMLParser.HTMLParser):

 def __init__(self):
  self.stuff = ""
  self.sep = ""
  self.on = False
  HTMLParser.HTMLParser.reset(self)

 def checktag(self,tag):
  res = 0
  if tag=="p" or tag=="br" or tag=="hr" or tag=="b" or tag=="i" or tag=="h1" or tag=="h2" or tag=="h3":
   res = 1
  elif tag=="img" or tag=="a":
   res = 2
  return res

 def flushStuff(self):
  if not self=="":
   print self.stuff.lstrip()
   self.stuff = ""

 def getAttr(self,attrs,name):
  res = ""
  for attr in attrs:
   if (attr[0]==name):
    res = " " + name + "=\"" + attr[1] + "\""
  return res
 
 def handle_starttag(self,tag,attrs):
  if (tag=="body"):
   self.on = True
  if self.on:
   cl = self.checktag(tag)
   if cl==1:
    print "<" + tag + ">"
   elif cl==2:
    if tag=="a":
     self.flushStuff()
     print "<" + tag + self.getAttr(attrs,"href") + ">"
    elif tag=="img":
     self.flushStuff()
     print "<" + tag + self.getAttr(attrs,"src") + self.getAttr(attrs,"width") + self.getAttr(attrs,"height") + self.getAttr(attrs,"border") + "\">"

 def handle_endtag(self,tag):
  if self.on:
   cl = self.checktag(tag)
   if cl>0:
    self.flushStuff()
    print "</" + tag + ">"

 def handle_data(self,data):
  if self.on:
   data = data.replace("\r"," ").replace("\n"," ").replace("\t"," ")
   if data[0]==" ":
    self.stuff = self.stuff + " "
   self.stuff = self.stuff + data.strip()
   if data[len(data)-1:]==" ":
    self.stuff = self.stuff + " "
 

cleaner = HtmlCleaner()
doc = file(sys.argv[1],"r+")
for line in doc:
 line = line.replace("<![","<!--").replace("]>","-->")
 cleaner.feed(line)

doc.close()

Comments

  • Anonymous
    January 01, 2003
    Иван: спасибо за ссылки, занятно. Насчет кавычек, пожалуй надо будет добавить их тоже? Правда сам я скорее всего буду пользоваться своим, поскольку это я пишу для жены, чтобы ей в один шаг чистить и публиковать, так что программный API приятнее, чем кого-то еще гонять. Алекс: скорее всего именно так.

  • Anonymous
    January 01, 2003
    Хм, а что WLW делает с длинными тире и правильными кавычками в том случае, если они уже стоят в тексте? Даже интересно стало. На самом деле, был бы занятно, если бы скрипт помимо вычищения лишнего ещё и расставлял  правильную типографику — а-ля «типограф» Лебедева (http://www.artlebedev.ru/tools/typograf/). По поводу «умеренного WYSIWYG» — тоже давно ищу подходящую программу. Сравнительно недавно (пару месяцев назад) посмотрел на Expressions Web (ещё первой версии) — и неожиданно остался доволен. Лишних тегов практически не ставит. Сложное тестирование на текстах я ему пока не устраивал, как-то не надо было. А вот с таблицами он справляется хорошо — а это имено то, что мне в первую очередь требуется от такого инструмента. Например, в нём нарисована вот эта табличка: http://blogs.technet.com/vm/archive/2008/04/17/kb-hyper-v.aspx

  • Anonymous
    June 03, 2008
    ИМХО, задача интересная только как тренировочная. Слишком много инструментов которые позволяют исправлять это с лёгкостью и большей точностью http://www.fourmilab.ch/webtools/demoroniser/ и http://www.w3.org/People/Raggett/tidy/

  • Anonymous
    June 03, 2008
    Давно ищу правильный редактор, для набора текстов для web. Нужен такой специальный "умеренный WYSIWYG", который с одной стороны избаил бы от необходимости руками писать простой HTML, а с другой - выдавал бы простой семантический код, без стилей и прочих излишеств. WLW хорош, но он выдает кашу из тегов и текста, которую потом сложно править (необходимость в этом все равно иногда остается). И еще в нем убиваются символы типа длинного тире и &laquo;русских&raquo; кавычек. Dreamweaver - тяжеловесен и специализирован для других целей. А в Ворде действительно очень не хватало чего-то вроде чекбокса "Dump styles and metadata". Так что попробуем скрипт... Кстати, на эту тему была еще официальная утилита Office 2000 HTML Filter (http://b23.ru/yxw). Правда, на сколько она работает с Word2000+, не проверял. Возможно Save as filtered HTML - это то, во что она переросла.

  • Anonymous
    June 04, 2008
    > Насчет кавычек, пожалуй надо будет добавить их тоже? Кавычки да, но не проще ли сразу перейти на tidylib?. Насколько я помню там больше чем просто чистка тэгов - это ещё и преобразрвание закодированных символов &gt; или &minus; обратно. Например, польза с tidy не только в уменьшение размеров файла, но и приведение HTML к стандарту. Относительно API для Python: http://utidylib.berlios.de/