一种整理HTML和JS代码的方法

tidy可以整理HTML但不动里面的JS代码。prettier可以整理JS代码,它能不能整理HTML+JS呢?

我写完两个程序后才发现原来可以啊。不过还是把破程序贴出来吧,再说也许发现了prettier的一个bug.

get-js.py

from bs4 import BeautifulSoup as BS
import sys

bs = BS(open(sys.argv[1], 'r'), 'html.parser')
n = 0
for t in bs.find_all('script'):
  s = t.string
  if s is None: continue
  with open(f'{n:02d}.js', 'w') as f:
    print(s, file=f, end='')
  n += 1
View Code

rm-js.py

from html.parser import HTMLParser
import sys

class ScriptRemover (HTMLParser):
  T = 'script'

  def __init__(m):
    super().__init__(); m.in_script = False

  @staticmethod
  def ta(t, a):
    s = '<' + t
    if len(a): s += ' ' + ' '.join(f'{k}="{v}"' for k,v in a)
    return s

  def handle_starttag(m, t, a):
    print(f'{m.ta(t,a)}>', end='')
    if t.lower() == m.T: m.in_script = True

  def handle_endtag(m, t):
    print(f'</{t}>', end='')
    if t.lower() == m.T: m.in_script = False

  def handle_data(m, data):
    if not m.in_script: print(data, end='')

  def handle_startendtag(m, t, a): print(f'{m.ta(t,a)}/>', end='')

ScriptRemover().feed(sys.stdin.read())
View Code

JS里裸放个JSON,prettier说语法错误。该JSON用别的工具们验证没问题:浏览器加载JS控制台无错误信息,Python的json.load()成功。改成形如x={"age":0}后prettier不报错。

# apt install tidy

# man tidy; -w --width

# apt install nodejs npm
# npm install -g prettier -g --global为所有用户安装

# prettier -h --help -c --check -w --write

浏览器不会把&lt;script&gt;作为script对待,而是作为普通文本显示<script>

BeautifulSoup(), param features: Desirable features of the parser to be used. This may be the name of a specific parser ("lxml", "lxml-xml", "html.parser", or "html5lib") or it may be the type of markup to be used ("html", "html5", "xml"), 实测"html"不行,"html.parser"可以。

BeautifulSoup.find_all(self, name=None, attrs={}, recursive=True, string=None, limit=None, **kwargs),看见有人写find_all(True),不知何意。

试了下:

def find_all(self, name=None, attrs={}, recursive=True, string=None, limit=None, **kwargs):
  print(f'{name}, {attrs} {recursive}')
find_all(1, True, recursive=False)

True, {} False

'' == True是False. '' == False也是False

自定义类重载了__eq__时,使用==判断None会出错。{} '' 0都是False. 

>>> '' is None
<stdin>:1: SyntaxWarning: "is" with a literal. Did you mean "=="?
False

posted @ 2025-10-11 21:02  华容道专家  阅读(9)  评论(0)    收藏  举报