如何用JavaScript/Windows Batch提取HTML中的IPA值?代码报错求助
解决Batch+JScript混合代码提取HTML IPA音标报错问题
问题描述
要从剑桥词典页面的HTML中提取IPA音标buːm,编写的Windows Batch与JScript混合代码运行时提示Microsoft JScript runtime error: 对象不支持此属性或方法。
相关HTML片段:
</span><span class="pron dpron">/<span class="ipa dipa lpr-2 lpl-1">buːm</span>/</span></span></div><div class="pos-body">
原报错代码:
@if (@CodeSection == @Batch) @then @echo off setlocal curl https://dictionary.cambridge.org/de/worterbuch/englisch/boom >phoneme.html set "htmlfile=phoneme.html" rem // invoke JScript hybrid code and capture its output for /f %%I in ('cscript /nologo /e:JScript "%~f0" "%htmlfile%"') do set "converted=%%I" echo %converted% rem // end main runtime PAUSE goto :EOF @end // end batch / begin JScript chimera var fso = WSH.CreateObject('scripting.filesystemobject'), DOM = WSH.CreateObject('htmlfile'), htmlfile = fso.OpenTextFile(WSH.Arguments(0), 1), html = htmlfile.ReadAll(); DOM.write(html); htmlfile.Close(); var scrape = DOM.getElementsByTagName('pron dpron').getElementsByClassName('ipa dipa lpr-2 lpl-1')[0].innerText; WSH.Echo(scrape.match(/^.*=\s+(\S+).*$/)[0]);
错误原因分析
- 标签名与类名混淆:
getElementsByTagName是按HTML标签名(如span、div)查找元素,而pron dpron是元素的class属性值,不能用此方法查找。 - 集合链式调用错误:
getElementsByClassName返回的是元素集合,无法直接链式调用另一个getElementsByClassName,必须先取集合中的具体元素。 - 多余正则匹配:目标文本就是
buːm,无需用正则表达式额外处理,反而会导致匹配失败。
修正后的代码
@if (@CodeSection == @Batch) @then @echo off setlocal curl https://dictionary.cambridge.org/de/worterbuch/englisch/boom >phoneme.html set "htmlfile=phoneme.html" rem // invoke JScript hybrid code and capture its output for /f %%I in ('cscript /nologo /e:JScript "%~f0" "%htmlfile%"') do set "converted=%%I" echo %converted% rem // end main runtime PAUSE goto :EOF @end // end batch / begin JScript chimera var fso = WSH.CreateObject('scripting.filesystemobject'), DOM = WSH.CreateObject('htmlfile'), htmlfile = fso.OpenTextFile(WSH.Arguments(0), 1), html = htmlfile.ReadAll(); DOM.write(html); htmlfile.Close(); // 先获取外层class为pron dpron的span元素 var pronContainer = DOM.getElementsByClassName('pron dpron')[0]; // 在容器内查找目标IPA元素并提取文本 var scrape = pronContainer.getElementsByClassName('ipa dipa lpr-2 lpl-1')[0].innerText; // 直接输出提取到的音标 WSH.Echo(scrape);
关键修改点
- 替换
getElementsByTagName('pron dpron')为getElementsByClassName('pron dpron'),正确按class查找元素。 - 拆分元素查找步骤,先获取外层容器元素,再在容器内查找目标元素,避免集合直接链式调用的错误。
- 移除多余的正则匹配代码,直接输出提取到的innerText,确保得到正确的
buːm音标。
内容的提问来源于stack exchange,提问作者Franklyn W. R. Tigier
相关产品推荐
相关产品推荐

