代码之家  ›  专栏  ›  技术社区  ›  Marbles

如何使用编程语言将HTML文件保存为非格式化文本而不是代码?

  •  0
  • Marbles  · 技术社区  · 8 年前

    我知道这个问题有点笼统,但我正在为我的Windows 10命令提示符做一个扩展,允许你在程序中将HTML视为纯文本。我不知道不为这样的东西构建一个解释器是否会被认为是懒惰的,但对于我将要使用的东西来说,这似乎是太多的工作了。为我所知甚少的标记语言制作一个解释器似乎没有必要,而在Batch中进行解释器则更难。

    我知道如何读取文件并将其存储为变量,但我的问题是如何将原始HTML存储为无格式的纯文本。例如,

    <p>Here's some text.</p>
    

    将成为:

    Here's some text.
    

    我想要一个解释器把HTML转换成纯文本。它不需要用Batch编写,但如果是这样的话就可以了。不过,我更喜欢用更高级的语言编写它,比如Python,我以前见过它用来解释编程语言。它不需要你写,所以推荐就可以了。

    对不起,如果我花时间解释的话。即使是部分解决方案也可以。谢谢你的帮助!

    3 回复  |  直到 8 年前
        1
  •  0
  •   rojo    8 年前

    将来,请展示一些代码,以证明您试图自己解决问题。类似于“这是我的要求。现在为我写或给我找一个工具”的问题在这里通常不太受欢迎。

    但部分原因是为了避免进一步的半途而废,部分原因是我喜欢这个挑战,这里有一个混合Batch+JScript脚本的解决方案,它将编写 innerText 将HTML添加到控制台。用.bat扩展名保存它。如果希望输出转到文件,则 batscript.bat htmlfile > outfile.txt 在cmd线。

    @if (@CodeSection == @Batch) @then
    @echo off & setlocal
    
    if "%~1"=="" goto usage
    if not exist "%~1" goto usage
    
    cscript /nologo /e:JScript "%~f0" "%outfile%" < "%~1"
    goto :EOF
    
    :usage
    2>&1 echo Usage: %~nx0 htmlfile
    goto :EOF
    
    @end // end Batch / begin JScript
    
    var htmlfile = WSH.CreateObject('htmlfile');
    
    htmlfile.write('<meta http-equiv="x-ua-compatible" content="IE=9" />');
    htmlfile.write(WSH.StdIn.ReadAll());
    
    WSH.Echo(htmlfile.documentElement.innerText);
    htmlfile.close();
    

    IE9兼容模式被调用以识别更多的HTML元素类型,同时仍允许Vista兼容。你可以改变 IE=9 到10、11或Edge(如果需要)。


    如果您喜欢非混合脚本,还可以构造 htmlfile 使用PowerShell的COM对象。它的执行速度较慢,但代码更简单(尽管有奇怪的.NET方法名)。示例:

    .bat脚本:

    @echo off & setlocal
    
    if "%~1"=="" goto usage
    if not exist "%~1" goto usage
    
    set "htmlfile=%~f1"
    
    set "psCommand="^
        $h=new-object -COM htmlfile;^
        $h.IHTMLDocument2_write('^<meta http-equiv="x-ua-compatible" content="IE=9" /^>');^
        $h.IHTMLDocument2_write(${%htmlfile%});^
        $h.documentElement.innerText""
    
    powershell -noprofile -noninteractive %psCommand%
    
    goto :EOF
    
    :usage
    echo Usage: %~nx0 htmlfile
    goto :EOF
    

    .ps1脚本:

    param( $htmlfile = $false )
    
    if (-not (test-path $htmlfile)) {
        [console]::Error.WriteLine("Usage: $($MyInvocation.MyCommand.Name) htmlfile")
        exit
    }
    
    $html = gc $htmlfile | out-string
    $hObj = new-object -COM htmlfile
    $hObj.IHTMLDocument2_write('<meta http-equiv="x-ua-compatible" content="IE=9" />')
    $hObj.IHTMLDocument2_write($html)
    $hObj.documentElement.innerText
    $hObj.Close()
    

    (.ps1解决方案的用法示例: powershell .\scriptname.ps1 htmlfile.html )


    因为我这样做是为了个人挑战,这里有一个批量+HTA混合变体,它将 内部文本 未保存到新的记事本窗口,因为我可以。

    <!-- : batch portion
    @echo off & setlocal
    
    if "%~1"=="" goto usage
    if not exist "%~1" goto usage
    
    mshta "%~f0" < "%~1"
    goto :EOF
    
    :usage
    2>&1 echo Usage: %~nx0 htmlfile
    goto :EOF
    
    end Batch / begin HTA -->
    
    <meta http-equiv="x-ua-compatible" content="IE=9" />
    <div id="out"></div>
    
    <script>
    var fso = new ActiveXObject('Scripting.FileSystemObject'),
        osh = new ActiveXObject('WScript.Shell'),
        notepad = osh.Exec('notepad');
    
    document.getElementById('out').innerHTML = fso.GetStandardStream(0).ReadAll();
    clipboardData.setData('text', document.getElementById('out').innerText);
    
    var waitActive = setInterval(function() {
        if (osh.AppActivate(notepad.ProcessID)) {
            clearInterval(waitActive);
            close(osh.SendKeys('^v'));
        }
    }, 25);
    
    </script>
    

    我使用HTA来规避浏览器安全性,防止对剪贴板的写访问(就像 html文件 COM对象),并且因为HTA重量较轻,不像 InternetExplorer.Application COM对象。

        2
  •  0
  •   user6017774 user6017774    8 年前
    Set ie = CreateObject("InternetExplorer.Application") 
    ie.Visible = 0
    ie.Silent = 1 
    ie.Navigate2 "file://" & FilterPath & "Filter.html"
    
    Do 
        wscript.sleep 50            
    Loop Until ie.document.readystate = "complete"
    
    ie.document.body.innerhtml = Inp.readall
    Outp.write ie.document.body.innertext
    
    'ie.quit
    

    InP.ReadAll 是textstream对象中的html文本, OutP 在另一个textstream对象中包含纯文本。

    导航到本地文件以删除安全对话框和限制。用html文本替换该文件的文本(仅在内存中)( ie.document.body.innerhtml = Inp.readall ). 然后把它读回来,并把它写成文本( Outp.write ie.document.body.innertext ).

    InP和OutP在上述代码截图中没有定义,但它们是文本流对象。

        3
  •  0
  •   Florian Straub    8 年前

    PHP有 strip_tags 也可以从命令行运行。

    $url = 'http://www.somedoma.in/some_file.htm';
    $website =  file_get_contents($url);
    echo strip_tags($website);
    

    然后你可以使用 php.exe 以运行脚本。