【问题标题】:How can i get a clean script embedded in an html page with python standard library如何使用 python 标准库在 html 页面中嵌入干净的脚本
【发布时间】:2019-07-20 20:18:30
【问题描述】:

我正在尝试从 sololearn 网站备份我的代码。我当然可以复制/粘贴它,但因为我想为其他代码重复它,也为了学习目的,我想用 python 代码来做,并且尽可能只使用标准库。

我在这里介绍更基本的尝试。我也一直在努力处理 HTMLParser、html.entities、xml.etree,我尝试将响应解码为“utf-8”,以通过 html.unescape() 传递它。结果总是很脏。 这种脏:\u003c!DOCTYPE html\u003e\r\n\u003chtml\u003e\r\n\u003c!--\r\ 有时少,但从不清理

from urllib.request import urlopen
import re

url = "https://code.sololearn.com/************/#"
with urlopen(url) as response:
    page = str(response.read())

code = re.search(r'window.code = "(.*)";.*window.cssCode',page).group(1)
    print(code)

目标是备份我的文件,以干净的函数形式将它们写入文件,代码可以是 html+css+js、python、c 等...我还尝试使用正则表达式处理脏结果修改,但我认为这是不可能的,因为代码可能包含不应修改的故意元素,如“\r\n”。

【问题讨论】:

    标签: python html json python-3.x urllib


    【解决方案1】:

    似乎你得到了 JSON 编码的字符串。您可以使用ast.literal_eval() (doc) 来解码字符串:

    from ast import literal_eval
    from urllib.request import urlopen
    import re
    
    url = "https://code.sololearn.com/************/#"
    with urlopen(url) as response:
        page = response.read().decode('utf-8')
    
    code = re.search(r'window.code = "(.*)";.*window.cssCode',page, flags=re.DOTALL).group(1)
    
    print(literal_eval('"' + code + '"'))
    

    打印:

    <!DOCTYPE html>
    <html>
    <!--
    If you're interested in the tools used here:
    
    to display a partition:
    http://www.vexflow.com/
    
    to make it sound:
    https://tonejs.github.io/
    -->
    <head>
      <link href="https://fonts.googleapis.com/css?family=Annie+Use+Your+Telescope&display=swap" rel="stylesheet">
      <script src="https://cdnjs.cloudflare.com/ajax/libs/tone/13.8.12/Tone.js"></script>
      <script src="https://unpkg.com/vexflow/releases/vexflow-min.js"></script>
      <title>Melody Generator</title>
    </head>
    
    <body>
      <div id="wrapper">
        <div id="popup">
          <div id="description">description gonna be here</div>
          <div id="choice"></div>
        </div>
        <div id="input" class="blur">
          <div id="melody">
            <h1>Melody</h1>
            <textarea id="melo_num" class="text_input" placeholder="Enter two words..."></textarea>
            <p id="melo_rebased"></p>
          </div>
          <div id="rhythm">
            <h1>Rhythm</h1>
            <textarea id="rhyt_num" class="text_input" placeholder="...hear some magic !"></textarea>
            <p id="rhyt_rebased"></p>
          </div>
        </div>
        <div id="partition" class="blur"></div>
        <div id="controls" class="blur">
          <div id="back" class="control">back</div>
          <div id="play" class="control">play</div>
          <div id="stop" class="control">stop</div>
        </div>
        <div id="current" class="blur"></div>
        <p></p>
        <div id="settings" class="blur">
          <div id="loop" class="blur">loop
            <div class="twinkle lamp" id="loop_lamp"></div>
          </div>
          <div id="root" class="blur">root
            <div class="lamp" id="root_lamp"></div>
          </div>
          <div id="mode" class="blur">mode
            <div class="lamp" id="mode_lamp"></div>
          </div>
                <div id="range" class="blur">range
            <div class="lamp" id="range_lamp"></div>
          </div>
          <div id="rhythm" class="blur">rhythm
            <div class="lamp" id="rhythm_lamp"></div>
          </div>
          <div id="convert" class="blur">convert
            <div class="lamp" id="convert_lamp"></div>
          </div>
          <div id="volume" class="blur slider_box">
            volume
            <input id="sound_vol" class="slider" type="range" min="-50" max="0" value="-10">
          </div>
          <div id="speed" class="blur slider_box">
            speed
            <input id="speed_lvl" class="slider" type="range" min="0" max="200" value="100">
          </div>
          <div id="sustain" class="blur slider_box">
            sustain
            <input id="sustain_lvl" class="slider" type="range" min="0" max="200" value="100">
          </div>
          <div id="demo" class="blur">demo
            <div class="lamp" id="demo_lamp"></div>
          </div>
        </div>
        <p></p>
      </div>
    </body>
    
    </html>
    

    或者使用json.loads()doc):

    import json
    print(json.loads('"' + code + '"'))
    

    【讨论】:

    • 看起来它正在工作,只有一个奇怪的事情,当我使用它时,与您显示的结果不同,每次有换行符时都会添加一个额外的换行符。知道为什么吗?
    • 是的,两者都一样。我正在使用 .decode("utf-8")
    • @Cépagrave 那么不知道,在我的计算机上运行代码,它可以正确打印。也许与终端设置有关。也尝试逐行打印并在每一行使用.strip()
    • 逐行解决方案效果很好!但是,糟糕,我刚刚读到使用条款禁止抓取。我将编辑并隐藏网址。
    猜你喜欢
    • 2012-06-01
    • 2021-01-17
    • 2016-10-07
    • 2021-04-28
    • 1970-01-01
    • 1970-01-01
    • 2016-04-15
    • 1970-01-01
    • 2019-05-13
    相关资源
    最近更新 更多