[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[其他] [已解决]如何提取海词在线词典中的“海词释义常用度分布图”

本帖最后由 qixiaobin0715 于 2019-8-28 14:07 编辑

给出一个单词列表文本文件,如何提取对应的海词释义常用度分布图。
http://dict.cn/

两位大神给出的代码提取结果均符合我期望的结果。谢谢!!!

TOP

回复 45# qixiaobin0715


    先前我对制表符理解有误,是需要4列数据吧?已修改。
微信:flashercs
QQ:49908356

TOP

修正一下
  1. @set @i=0 /* & @echo off & cscript.exe -NoLogo -E:JScript %0 <单词列表.txt >结果.txt& pause & exit */
  2. var xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
  3. function GetContent(url) {
  4.         xmlhttp.open("GET", url ,false);
  5.         xmlhttp.send();
  6.         return(xmlhttp.responseText);
  7. }
  8. function getByClass(tag,Classname){
  9.         if(html.getElementsByClassName){
  10.                 return html.getElementsByClassName(Classname);
  11.         }
  12.         var tags = html.getElementsByTagName(tag);
  13.         for(var i = 0,len = tags.length; i < len; i++){
  14.                 if( tags[i].className ==Classname){
  15.                          return(tags[i]);
  16.                 }
  17.         }
  18. }
  19. while (!WSH.StdIn.AtEndOfStream) {
  20.         var s = WSH.StdIn.ReadLine();
  21.         var str = s;
  22.         var url = "http://dict.cn/" + str;
  23.         var html = new ActiveXObject("htmlfile");
  24.         html.write(GetContent(url));
  25.         try {
  26.                 var ul = getByClass("div","basic clearfix");
  27.                 str += "\t" + ul.innerText.replace(/[\r\n]/gm,'') + "。\t";
  28.                 if (html.getElementById("dict-chart-basic")) {
  29.                         var obj = new Function("return" + unescape(html.getElementById("dict-chart-basic").data))();
  30.                         for(var key in obj ) { str += obj[key].percent > 5 ? obj[key].sense + ":"+ obj[key].percent + "%, " : ""};
  31.                 }
  32.                 var div = getByClass("div","layout sort");
  33.                 if (div) {
  34.                         str+= '\t'
  35.                         var b = div.getElementsByTagName("b");
  36.                         var ol = div.getElementsByTagName("ol");
  37.                         for (var i=0; i<ol.length; i++) {
  38.                                 var s =b[i];
  39.                                 if (s) { str+= s.innerText + '<br>' };
  40.                                 var li= ol[i].getElementsByTagName("li");
  41.                                 for (var j=0, len = li.length; j<len; j++) {
  42.                                         if (j < 2) {str+= j+1 + '. ' + li[j].innerText + '<br>' };
  43.                                 }
  44.                         }
  45.                 }
  46.        }
  47.         catch (e) {str += "\t" + "错误"};
  48.         WSH.Echo(str.replace(/\r?\n/g,'<br>'));
  49. }
复制代码

TOP

回复 47# qixiaobin0715
将25行 改为下面的试
  1. var ul = getByClass("div","basic clearfix");
复制代码

TOP

回复 46# terse

未能提取的是一些不存在释义常用度分布图的单词,我还是需要提取释义和例句。如:
  1. do
  2. one
  3. order
  4. mine
  5. communicate
  6. guarantee
  7. operator
复制代码

TOP

回复 44# qixiaobin0715
把漏提的发上来 看看什么问题

TOP

回复 38# qixiaobin0715

提取的文件增加制表符对齐相同内容问题,用文本编辑器打开,用正则表达式替换已解决。

TOP

回复 42# terse

不错。就是速度稍慢,少部分单词漏提。

TOP

回复 41# flashercs

完美!!!

TOP

怎么这么复杂呢 混编的也行吧
  1. @set @i=0 /* & @echo off & cscript.exe -NoLogo -E:JScript %0 <单词列表.txt >结果.txt& pause & exit */
  2. var xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
  3. function GetContent(url) {
  4.         xmlhttp.open("GET", url ,false);
  5.         xmlhttp.send();
  6.         return(xmlhttp.responseText);
  7. };
  8. function getByClass(tag,Classname){
  9.         if(html.getElementsByClassName){
  10.                 return html.getElementsByClassName(Classname);
  11.         }
  12.         var tags = html.getElementsByTagName(tag);
  13.         for(var i = 0,len = tags.length; i < len; i++){
  14.                 if( tags[i].className ==Classname){
  15.                          return(tags[i]);
  16.                 }
  17.         }
  18. }
  19. while (!WSH.StdIn.AtEndOfStream) {
  20.         var s = WSH.StdIn.ReadLine();
  21.         var str = s;
  22.         var url = "http://dict.cn/" + str;
  23.         var html = new ActiveXObject("htmlfile");
  24.         html.write(GetContent(url));
  25.         var ul = getByClass("ul","dict-basic-ul");
  26.         if (ul) {
  27.                 str += "\t" + ul.innerText.replace(/[\r\n]/gm,'') + "。\t"
  28.                 if (html.getElementById("dict-chart-basic")) {
  29.                         var obj = new Function("return" + unescape(html.getElementById("dict-chart-basic").data))();
  30.                         for(var key in obj ) { str += obj[key].percent > 5 ? obj[key].sense + ":"+ obj[key].percent + "%, " : ""};
  31.                 };
  32.                 var div = getByClass("div","layout sort");
  33.                 if (div) {
  34.                         str+= '\t'
  35.                         var b = div.getElementsByTagName("b");
  36.                         var ol = div.getElementsByTagName("ol");
  37.                         for (var i=0; i<ol.length; i++) {
  38.                                 var s =b[i];
  39.                                 if (s) { str+= s.innerText + '<br>' };
  40.                                 var li= ol[i].getElementsByTagName("li");
  41.                                 for (var j=0, len = li.length; j<len; j++) {
  42.                                         if (j < 2) {str+= j+1 + '. ' + li[j].innerText + '<br>' };
  43.                                 };
  44.                         };
  45.                         WSH.Echo(str.replace(/\r?\n/g,'<br>'));
  46.                 };
  47.        };
  48.        else { str += "\t" + "错误" };
  49. };
复制代码

TOP

回复 40# qixiaobin0715


    改
微信:flashercs
QQ:49908356

TOP

回复 39# flashercs

已扫码。
极少部分单词出现问题,显示源页面,并且提取不到。比如:face,contact,confront,encounter等。

TOP

本帖最后由 flashercs 于 2019-11-9 11:08 编辑
  1. <#*,:&cls
  2. @echo off
  3. pushd "%~dp0"
  4. Powershell -NoProfile -ExecutionPolicy RemoteSigned -Command ". ([ScriptBlock]::Create((Get-Content -LiteralPath \"%~0\" -ReadCount 0 | Out-String ))) "
  5. popd
  6. pause
  7. exit /b
  8. #>
  9. $VerbosePreference = "Continue"
  10. $inputFile = "单词列表.txt"
  11. $outputFile = "结果.txt"
  12. Get-Content -LiteralPath $inputFile -OutBuffer 100 | ForEach-Object -Begin {
  13.   $sw = New-Object -TypeName System.IO.StreamWriter -ArgumentList $outputFile, $false, ([System.Text.Encoding]::Default), 65536
  14.   # webclient settings
  15.   $webclient = New-Object -TypeName System.Net.WebClient
  16.   $webclient.BaseAddress = 'http://dict.cn/'
  17.   $webclient.Encoding = [System.Text.Encoding]::UTF8
  18.   $webclient.Headers.Add("Accept", "text/html, application/xhtml+xml, application/xml; q=0.9, */*; q=0.8")
  19.   $webclient.Headers.Add("Accept-Encoding", "gzip")
  20.   $webclient.Headers.Add("Accept-Language", "en-US, en; q=0.8, zh-Hans-CN; q=0.5, zh-Hans; q=0.3")
  21.   # xml parser
  22.   $xmldoc = New-Object -TypeName System.Xml.XmlDocument
  23.   # re
  24.   $remain = [regex]'(?si)<div\s+class="main"[^>]*>.*?(?=<div\s+class="righter")'
  25.   # $recontent = [regex]'(?si)<div\s+class="word"[^>]*>.*?(?=<div\s+class="section[^"]*"[^>]*>)'
  26.   $rejs = [regex]'(?si)<script[^>]*>.*?</script>'
  27.   # $resent = [regex]'(?si)(?<=<h3[^>]*>例句</h3>).*?(?=<h3)'
  28.   $reXMLEntities = [regex]'(?si)&[^;<]*(;|(?=<|$))'
  29.   $evaluator = {
  30.     param($m)
  31.     $s = $m.Value;
  32.     if ($m.Groups[1].Value -eq '') {
  33.       $s += ';'
  34.     }
  35.     [System.Web.HttpUtility]::HtmlEncode([System.Web.HttpUtility]::HtmlDecode($s))
  36.   } -as [System.Text.RegularExpressions.MatchEvaluator]
  37.   # stringbuilder
  38.   $strbuilder = New-Object -TypeName System.Text.StringBuilder
  39.   Add-Type -AssemblyName System.Web.Extensions
  40.   $JSON = New-Object -TypeName System.Web.Script.Serialization.JavascriptSerializer -ErrorAction Stop
  41.   # $vsaengine = [Microsoft.JScript.Vsa.VsaEngine]::CreateEngine()
  42.   Add-Type -AssemblyName System.Web
  43. } -Process {
  44.   Write-Verbose "Fetching $_ ..."
  45.   for ($i = 2; $i -ge 0; $i--) {
  46.     try {
  47.       $readstream = $webclient.OpenRead($_)
  48.       Write-Verbose "Fetch $_ success"
  49.       break
  50.     } catch {
  51.       $_ | Out-String | Write-Host -ForegroundColor Red
  52.     }
  53.   }
  54.   if ($readstream) {
  55.     try {
  56.       $gzipstream = New-Object -TypeName System.IO.Compression.GZipStream -ArgumentList $readstream, ([System.IO.Compression.CompressionMode]::Decompress)
  57.       $sr = New-Object -TypeName System.IO.StreamReader -ArgumentList $gzipstream, ([System.Text.Encoding]::UTF8)
  58.       $strhtml = $sr.ReadToEnd()
  59.       $match = $remain.Match($strhtml)
  60.       # div.main matched
  61.       if ($match.Success) {
  62.         Write-Verbose "Match $_ success"
  63.         # convert html to xml
  64.         $strxml = $rejs.Replace($match.Value, '') -replace '(?s)<!--.*?-->' -replace '<([^\x00-\x7e]+)>', '&lt;$1&gt;' -replace '<br>', '<br/>'
  65.         $strxml = $reXMLEntities.Replace($strxml, $evaluator)
  66.         $xmldoc.LoadXml($strxml)
  67.         $strbuilder.Length = 0
  68.         $nodeWord = $xmldoc.DocumentElement.SelectSingleNode('div[@class="word"]')
  69.         # word-cont
  70.         [void]$strbuilder.Append($nodeWord.SelectSingleNode('.//h1[@class="keyword"]/text()').Value).Append("`t")
  71.         # dict-translation
  72.         [void]$strbuilder.Append( ($nodeWord.SelectNodes('.//ul/li[position()<last()]') | ForEach-Object { $_.innerText }) -join " " ).Append("`t")
  73.         # dict-chart
  74.         $nodeChartBasic = $nodeWord.SelectSingleNode('.//div[@id="dict-chart-basic"]/@data')
  75.         # chart basic exist
  76.         if ($nodeChartBasic) {
  77.           $strjson = [System.Uri]::UnescapeDataString($nodeChartBasic.Value)
  78.           $jsobj = $JSON.DeserializeObject($strjson)
  79.           foreach ($field in $jsobj.Keys) {
  80.             [void]$strbuilder.Append($jsobj.Item($field).Item('sense')).Append(':').Append($jsobj.Item($field).Item('percent')).Append(',')
  81.           }
  82.           [void]$strbuilder.Remove($strbuilder.Length - 1, 1)
  83.         }
  84.         [void]$strbuilder.Append("`t")
  85.         
  86.         # 例句
  87.         # $match1 = $resent.Match($strhtml)
  88.         $nodeSent = $xmldoc.DocumentElement.SelectSingleNode('div[@class="section sent"]/h3[text()="例句"]/following-sibling::div')
  89.         if ($nodeSent) {
  90.           try {
  91.             # $xmldoc.LoadXml(($match1.Value -replace '<br>', '<br/>' -replace '<([^\x00-\x7e]+)>', '&lt;$1&gt;'))
  92.             $nodeSent.SelectNodes('ol') | ForEach-Object {
  93.               # 用作形容词 (.adj)
  94.               [void]$strbuilder.Append(($_.PreviousSibling.InnerText -replace '\s+' -replace '\(', ' $&')).Append('<br>')
  95.               $_.SelectNodes('li[position()<3]') | ForEach-Object -Begin { $index = 0 } -Process {
  96.                 $index++;
  97.                 [void]$strbuilder.Append("$index.$(($_.SelectNodes('text()')|ForEach-Object {$_.Value}) -join '<br>')").Append('<br>')
  98.               }
  99.             }
  100.             [void]$strbuilder.Remove($strbuilder.Length - 4, 4)
  101.           } catch {
  102.             $_ | Out-String | Write-Host -ForegroundColor Red
  103.           }
  104.         } else {
  105.           Write-Verbose "没有例句."
  106.         }
  107.         # output result string
  108.         $sw.WriteLine(($strbuilder.ToString() -replace "[\r\n]+"))
  109.       } else {
  110.         Write-Verbose "Match $_ failed"
  111.       }
  112.     } catch {
  113.       $_ | out-string | Write-Host -ForegroundColor Red
  114.     } finally {
  115.       $readstream.Close()
  116.       Remove-Variable readstream
  117.       if ($gzipstream) {
  118.         $gzipstream.Dispose()
  119.       }
  120.       if ($sr) {
  121.         $sr.Dispose()
  122.       }
  123.     }
  124.   } else {
  125.     $sw.WriteLine($_)
  126.   }
  127. } -End {
  128.   $sw.Dispose()
  129.   $webclient.Dispose()
  130. }
复制代码
微信:flashercs
QQ:49908356

TOP

回复 38# flashercs

挺棒的!
经过测试,还有点小问题及要求:
1.下列单词提取时,有错误提示,例句未能提取:
  1. African-American
  2. CEO
  3. ie
  4. allegation
  5. annually
  6. anyone
  7. boyfriend
  8. businessman
  9. celebration
  10. Christianity
  11. courtroom
  12. educator
  13. girlfriend
  14. Hispanic
  15. incredibly
  16. initially
  17. Iraqi
  18. Israeli
  19. Jewish
  20. juror
  21. longtime
  22. mainstream
  23. obviously
  24. originally
  25. oversee
  26. Palestinian
  27. pastor
  28. playoff
  29. PM
  30. precisely
  31. publisher
  32. rebuild
  33. regularly
  34. reportedly
  35. significantly
  36. tablespoon
  37. teammate
  38. typically
  39. ultimately
  40. workplace
  41. yeah
复制代码
2.网页上本身没有释义度分布图的单词,释义和例句之间直接用制表符分隔,能否增加一个制表符,后续处理需要相同的部分对齐。
现在提取出来的形式是:
  1. PC abbr.个人计算机(=personal computer) <br>1.Maintenance of PC is in my element.<br>我对电脑的维修保养很在行。
复制代码
需要的格式是:
  1. PC abbr.个人计算机(=personal computer) <br>1.Maintenance of PC is in my element.<br>我对电脑的维修保养很在行。
复制代码

TOP

返回列表