标题: [其他] [已解决]如何提取海词在线词典中的“海词释义常用度分布图” [打印本页]
作者: qixiaobin0715 时间: 2019-8-21 09:54 标题: [已解决]如何提取海词在线词典中的“海词释义常用度分布图”
本帖最后由 qixiaobin0715 于 2019-8-28 14:07 编辑
给出一个单词列表文本文件,如何提取对应的海词释义常用度分布图。
http://dict.cn/
作者: 523066680 时间: 2019-8-21 11:12
图是HTML+JS的
数据可以很直接的抓出来- use utf8;
- use Encode;
- use File::Slurp;
- use Mojo::UserAgent;
- use URI::Escape;
- use JSON qw/from_json to_json/;
- STDOUT->autoflush(1);
-
- my $word = "command";
- my $url = "http://dict.cn/${word}";
- my $ua = Mojo::UserAgent->new();
- my $res = $ua->get($url)->result;
- my $json = $res->dom->at(".dict-chart")->attr("data");
- my $data = from_json(uri_unescape($json));
-
- if ( scalar keys %$data == 1 )
- {
- printf "%2s%% %s\n", $data->{1}{percent}, gbk($data->{1}{pos});
- }
- else
- {
- for my $k ( sort keys %$data )
- {
- printf "%2s%% %s\n", $data->{$k}{percent}, gbk($data->{$k}{sense});
- }
- }
-
- sub gbk { encode('gbk', $_[0]) }
复制代码
- 74% 命令
- 21% 指挥
- 4% 掌握
- 1% 博得
复制代码
作者: qixiaobin0715 时间: 2019-8-21 13:18
谢谢版主!我对批处理还不是太熟悉,上面脚本文件是否还需要安装第三方工具包?并且我的意思是按照单词列表文本文件同时提取若干个单词信息。希望再做指点。
作者: 523066680 时间: 2019-8-21 16:15
Strawberry Perl
http://strawberryperl.com/releases.html
需要门槛,不推荐使用。纯粹路过……
作者: qixiaobin0715 时间: 2019-8-21 17:34
回复 4# 523066680
还是要谢谢!
作者: zaqmlp 时间: 2019-8-21 23:22
本帖最后由 zaqmlp 于 2019-8-22 14:15 编辑
- <# :
- cls
- @echo off
- mode con lines=3000
- cd /d "%~dp0"
- powershell -NoProfile -ExecutionPolicy bypass "&{[ScriptBlock]::Create([IO.File]::ReadAllText('%~f0',[Text.Encoding]::Default)).Invoke()}"
- pause
- exit
- #>
- function gethtml($w){
- $html='';
- $url='http://dict.cn/'+$w;
- $web=New-Object System.Net.WebClient;
- $web.Encoding=[System.Text.Encoding]::UTF8;
- for($i=1;$i -le 4;$i++){
- try{
- $html=$web.DownloadString($url);
- break;
- }catch{write-host ('获取网页内容第'+$i.toString()+'次失败')};
- };
- return $html;
- };
- function gethz($s){
- $str='';
- $str=[regex]::replace($s,'\\u([\da-z]{4})',{param($a);[char][Convert]::ToInt32($a.groups[1].value, 16)});
- return $str;
- };
- $inputfile='单词列表.txt';
- $outfile='结果.txt';
- $min=5;
- [void][Reflection.Assembly]::LoadWithPartialName('System.Web');
- [System.Collections.ArrayList]$s=@();
- $text=[IO.File]::ReadAllLines($inputfile,[Text.Encoding]::Default);
- for($i=0;$i -lt $text.count;$i++){
- write-host ('------------'+$text[$i]+'------------');
- $content=gethtml $text[$i];
- $m=[regex]::match($content,'<div .*?id="dict-chart-basic" data="([^"]+?)"');
- if($m.success){
- $js=[Web.HttpUtility]::UrlDecode($m.groups[1].value);
- $tmp=(gethz $js) -replace '^\{|\}$','';
- $mm=[regex]::matches($tmp,'\{([^\}]+?)\}');
- [System.Collections.ArrayList]$t=@();
- if($mm.count -ge 1){
- foreach($it in $mm){
- $arr=$it.groups[1].value.split(':,', 4);
- if((1*$arr[1]) -ge $min){[void]$t.add($arr[3].Trim('"')+':'+$arr[1])};
- };
- };
- [void]$s.add($text[$i]+"`t"+($t -join ','));
- }else{
- [void]$s.add($text[$i]+"`t无");
- };
- };
- [IO.File]::WriteAllLines($outfile, $s, [Text.Encoding]::Default);
复制代码
作者: qixiaobin0715 时间: 2019-8-22 09:59
回复 6# zaqmlp
效果很好,谢谢!能否再修改一下脚本,满足以下要求:
1.把提取结果写入文本文件“提取结果.txt”。
2.格式为“单词+分隔符(比如制表符)+提取结果”。
3.过滤掉percent值小于5的条目。
第3条若不易实现保留也行。
单词列表数目有否限制?
作者: zaqmlp 时间: 2019-8-22 11:22
回复 7# qixiaobin0715
没赞助没动力
作者: qixiaobin0715 时间: 2019-8-22 12:06
回复 8# zaqmlp
尊重别人的劳动,都是在圈里混的,不会吃霸王餐的。
作者: zaqmlp 时间: 2019-8-22 13:18
回复 9# qixiaobin0715
那就扫码吧
作者: qixiaobin0715 时间: 2019-8-22 13:37
回复 10# zaqmlp
方便的话把前面的简明释义也加上吧。理解理解,现在社会的诚信有问题。已扫码。
作者: zaqmlp 时间: 2019-8-22 14:15
回复 7# qixiaobin0715
已修改
作者: qixiaobin0715 时间: 2019-8-22 14:29
回复 12# zaqmlp
基本达到要求,我是说如果结果是这样就完美了:- good adj. 好的;上等的;优秀的 ; n. 好处;善行 ;(复)goods:商品;货物. 好的:78,好处:11,优秀的:7
复制代码
作者: qixiaobin0715 时间: 2019-8-26 09:54
回复 6# zaqmlp
有空的话,还能给完善完善吗。这里先再次感谢了。
作者: flashercs 时间: 2019-8-29 12:25
本帖最后由 flashercs 于 2019-9-3 19:46 编辑
- <#*,:&cls
- @echo off
- pushd "%~dp0"
- Powershell -NoProfile -ExecutionPolicy RemoteSigned -Command ". ([ScriptBlock]::Create((Get-Content -LiteralPath \"%~0\" -ReadCount 0 | Out-String ))) "
- popd
- pause
- exit /b
- #>
- $VerbosePreference = "Continue"
- $inputFile = "单词列表.txt"
- $outputFile = "结果.txt"
- Get-Content -LiteralPath $inputFile -OutBuffer 10 | ForEach-Object -Begin {
- $sw = New-Object -TypeName System.IO.StreamWriter -ArgumentList ("$pwd\$outputFile"), $false, ([System.Text.Encoding]::Default)
- # webclient settings
- $webclient = New-Object -TypeName System.Net.WebClient
- $webclient.BaseAddress = 'http://dict.cn/'
- $webclient.Encoding = [System.Text.Encoding]::UTF8
- $webclient.Headers.Add("Accept", "text/html, application/xhtml+xml, application/xml; q=0.9, */*; q=0.8")
- $webclient.Headers.Add("Accept-Encoding", "gzip")
- $webclient.Headers.Add("Accept-Language", "en-US, en; q=0.8, zh-Hans-CN; q=0.5, zh-Hans; q=0.3")
- # xml parser
- $xmldoc = New-Object -TypeName System.Xml.XmlDocument
- # re
- $recontent = [regex]'(?si)<div\s+class="word"[^>]*>.*?(?=<div\s+class="section[^"]*"[^>]*>)'
- $rejs = [regex]'(?si)<script[^>]*>.*?</script>'
- # stringbuilder
- $strbuilder = New-Object -TypeName System.Text.StringBuilder
- Add-Type -AssemblyName Microsoft.Jscript
- $vsaengine = [Microsoft.JScript.Vsa.VsaEngine]::CreateEngine()
- Add-Type -AssemblyName System.Web
- } -Process {
- Write-Verbose "Fetching $_ ..."
- for ($i = 2; $i -ge 0; $i--) {
- try {
- $readstream = $webclient.OpenRead($_)
- Write-Verbose "Fetch $_ success"
- break
- }
- catch {
- $_ | Out-String | Write-Host -ForegroundColor Red
- }
- }
- if ($readstream) {
- try {
- $gzipstream = New-Object -TypeName System.IO.Compression.GZipStream -ArgumentList $readstream, ([System.IO.Compression.CompressionMode]::Decompress)
- $sr = New-Object -TypeName System.IO.StreamReader -ArgumentList $gzipstream, ([System.Text.Encoding]::UTF8)
-
- $match = $recontent.Match($sr.ReadToEnd())
- if ($match.Success) {
- Write-Verbose "Match $_ success"
- $xmldoc.LoadXml(($rejs.Replace($match.Value, '') -replace '<([^\x00-\x7e]+)>', '<$1>'))
- $strbuilder.Length = 0
- # word-cont
- [void]$strbuilder.Append($xmldoc.SelectSingleNode('//h1[@class="keyword"]/text()').Value).Append("`t")
- # dict-translation
- [void]$strbuilder.Append( ($xmldoc.SelectNodes('//ul/li[position()<last()]') | ForEach-Object { $_.innerText }) -join " " ).Append("`t")
- try {
- # dict-chart
- $strjson = [System.Web.HttpUtility]::UrlDecode($xmldoc.SelectSingleNode('//div[@id="dict-chart-basic"]/@data').Value)
- $jsobj = [Microsoft.JScript.Eval]::JScriptEvaluate("($strjson)", $vsaengine )
- foreach ($field in $jsobj) {
- [void]$strbuilder.Append($jsobj.Item($field).Item('sense')).Append(':').Append($jsobj.Item($field).Item('percent')).Append(',')
- }
- [void]$strbuilder.Remove($strbuilder.Length - 1, 1)
- }
- catch {
- # $_ | Out-String | Write-Host -ForegroundColor Red
- }
- # output result string
- $sw.WriteLine(($strbuilder.ToString() -replace "[\r\n]"))
- # $strbuilder.ToString()|Out-Host
- }
- else {
- Write-Verbose "Match $_ failed"
- }
- }
- catch {
- $_ | Out-String | Write-Host -ForegroundColor Red
- }
- finally {
- $readstream.Close()
- Remove-Variable readstream
- if ($gzipstream) {
- $gzipstream.Dispose()
- }
- if ($sr) {
- $sr.Dispose()
- }
- }
- }
- else {
- $sw.WriteLine($_)
- }
- } -End {
- $sw.Dispose()
- $webclient.Dispose()
- }
复制代码
作者: qixiaobin0715 时间: 2019-8-29 18:07
回复 15# flashercs
测试成功!但存在一些小问题,有些单词未提取出来。分三种情况:
1.大多数属于单词本身在词典中不存在“分布图”,并且提示错误,结果中忽略。如fines、cavalry、GDP等
2.不存在分布图,运行未提示错误,直接忽略。如baseman。是释义中的括号造成的吗?
3.有“分布图”,直接忽略。不知什么情况。有这样几个单词:- in-depth
- storytelling
- same-sex
- high-end
- sweaty
- first-time
- president-elect
复制代码
请帮忙给看看。能否这样解决:
1.释义和分布图内容之间用制表符分隔。
2.对于第1、2条的问题,在提取结果中条目只列出单词和释义。
3.第3条出了什么问题,能否解决。
作者: flashercs 时间: 2019-8-29 20:24
回复 16# qixiaobin0715
你什么Windows系统?不太敢用htmldom,win7与win10对html兼容性差别很大
作者: terse 时间: 2019-8-29 20:49
本帖最后由 terse 于 2019-8-29 22:53 编辑
这样可以吗- @set @i=0 /* & @echo off & >提取结果.txt cscript.exe -NoLogo -E:JScript %0 <单词列表.txt & pause exit */
- var xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
- function GetContent(url) {
- xmlhttp.open("GET", url ,false);
- xmlhttp.send();
- return(xmlhttp.responseText);
- };
-
- while (!WSH.StdIn.AtEndOfStream) {
- var str = WSH.StdIn.ReadLine();
- if (str) {
- var url = "http://dict.cn/" + str;
- var html = new ActiveXObject("htmlfile");
- html.write(GetContent(url));
- var t = html.getElementsByTagName("ul")[0];
- if (t) {
- str += "\t" + t.innerText.replace(/[\r\n]/gm,'') + "。\t";
- if (html.getElementById("dict-chart-basic")) {
- var obj = new Function("return" + unescape(html.getElementById("dict-chart-basic").data))();
- for(var key in obj ){ str += obj[key].percent > 5 ? obj[key].sense + ":"+ obj[key].percent + "%, " : ""};
- }
- };
- else { str += "\t" + "错误" };
- WSH.Echo(str);
- };
- };
复制代码
作者: qixiaobin0715 时间: 2019-8-29 21:49
回复 17# flashercs
单位的电脑是Windows7,家里的是Windows10.最好能在单位用,家里用也可。
作者: qixiaobin0715 时间: 2019-8-29 21:55
回复 18# terse
因为有些单词不存在分布图信息,可能会产生错误。
你的代码测试后发现,遇到不含分布图的单词会闪退。比如单词railway就没有分布图信息。单词列表:
good
railway
big
闪退后,只有good的信息能够提取出来。
作者: flashercs 时间: 2019-8-29 22:04
回复 20# qixiaobin0715
已修改代码,请测试,支持win7和win10
作者: qixiaobin0715 时间: 2019-8-29 22:21
回复 21# flashercs
完全符合要求,很好用。
作者: terse 时间: 2019-8-29 22:54
回复 20# qixiaobin0715
加了一个判断
作者: qixiaobin0715 时间: 2019-8-29 23:06
回复 23# terse
测试成功!谢谢!
作者: qixiaobin0715 时间: 2019-8-29 23:08
这里一并感谢所有关注的人。谢谢!
作者: qixiaobin0715 时间: 2019-8-30 08:45
回复 15# flashercs
测试中发现了个小问题,海词查不到的单词比如sauté,提示错误,结果中忽略。好修改的话,就麻烦了,结果中只列出单词即可。这种情况不多,要是太麻烦了就算了。
作者: flashercs 时间: 2019-8-30 13:07
回复 26# qixiaobin0715
本来就有错误提示啊,结果也忽略了,你的意思是怎么修改?
作者: qixiaobin0715 时间: 2019-8-30 13:53
回复 27# flashercs
查不到的单词在结果文本中也占一行,此行只显示单词即可。
作者: qixiaobin0715 时间: 2019-8-30 14:38
回复 27# flashercs
算了,怪麻烦的,就这样吧。谢谢了
作者: flashercs 时间: 2019-8-30 19:44
回复 29# qixiaobin0715
已修改了,主要是没明白你的要求!
作者: qixiaobin0715 时间: 2019-8-31 09:08
回复 30# flashercs
有提示错误信息,列出来查不到的单词,完美。谢谢了,下次合作愉快!
作者: qixiaobin0715 时间: 2019-9-3 12:29
回复 15# flashercs
提取时有发现两个问题。
1.下面的单词提取不到内容:- do
- one
- order
- mine
- communicate
- guarantee
- operator
- steep
- abstract
- diabetes
复制代码
2.下面单词提取内容占据两行或三行:- than
- steady
- psychologist
- export
- Korean
复制代码
请给看看是哪里的问题!
作者: flashercs 时间: 2019-9-3 14:29
回复 32# qixiaobin0715
修复了第一个问题。
第二个问题是你记事本打开了自动换行。。。。。
作者: qixiaobin0715 时间: 2019-9-3 16:00
回复 33# flashercs
win7
不是自动换行,而是存在换行符。
作者: flashercs 时间: 2019-9-3 19:48
回复 34# qixiaobin0715
已修改
作者: qixiaobin0715 时间: 2019-9-3 20:11
回复 35# flashercs
辛苦了,谢谢!!!
作者: qixiaobin0715 时间: 2019-11-6 17:27
回复 35# flashercs
在前面的基础上增加提取例句内容:
1.例句放在最后,与前面内容用制表符隔开;
2.只需提取各个词性的前两个例句,若只有一个例句就提取一个,“查看更多”中的例句不需提取;
3.换行用<br>表示。
4.比如提取单词big,网页中例句形式显示如图,提取格式如下- big adj.大的;重要的;有雄心的;受欢迎的;adv.宏大地;夸大地;成功地;n.杰出的组织和个人 大的:71,重要的:11,夸大地:5,成功地:5,受欢迎的:4,杰出的组织和个人:2,宏大地:1,有雄心的:1 用作形容词 (adj.)<br>1.New York is a big commercial city.<br>纽约是一座大的商业城市。<br>2.His business yields big profits.<br>他的生意带来巨大的利润。<br>3.Don't cry, you are a big boy now.<br>别哭,你现在已经是大男孩了。<br>4.The big moment has come at last!<br>重要的时刻终于到来了!<br>5.The big thing is that you know what you want.<br>重要的是你必须知道自己想要什么。<br>6.He's got a lot of big ideas about how to change the system.<br>就如何改变体制,他有一些远大的想法。<br>7.That rock and roll band is very big in Chicago.<br>那个摇滚乐团在芝加哥很受欢迎。<br> 用作副词 (adv.)<br>1.You need to think big(= aim to achieve a lot).<br>你要敢想。<br>2.As for us, we mustn't talk big in our external propaganda.<br>在我们自己方面,对外宣传不要夸大。<br>3.The band comes over big with pop fans.<br>该乐队受流行音乐歌迷欢迎大为成功。<br> 用作名词 (n.) <br>1.With that new promotion he's now one of the bigs in the company.<br>通过那次得晋升,他现在是公司的杰出员工之一。
复制代码
也即是按下面格式提取:
前面提取内容 用作形容词(adj.)<br>1.第一个例句<br>译文<br>2.第二个例句<br>译文<br>用作副词(adv.)<br>...<br>用作名词(n.)<br>1.第一个例句<br>译文
希望您给予帮助,另有酬谢。
作者: qixiaobin0715 时间: 2019-11-7 09:56
回复 38# flashercs
挺棒的!
经过测试,还有点小问题及要求:
1.下列单词提取时,有错误提示,例句未能提取:- African-American
- CEO
- ie
- allegation
- annually
- anyone
- boyfriend
- businessman
- celebration
- Christianity
- courtroom
- educator
- girlfriend
- Hispanic
- incredibly
- initially
- Iraqi
- Israeli
- Jewish
- juror
- longtime
- mainstream
- obviously
- originally
- oversee
- Palestinian
- pastor
- playoff
- PM
- precisely
- publisher
- rebuild
- regularly
- reportedly
- significantly
- tablespoon
- teammate
- typically
- ultimately
- workplace
- yeah
复制代码
2.网页上本身没有释义度分布图的单词,释义和例句之间直接用制表符分隔,能否增加一个制表符,后续处理需要相同的部分对齐。
现在提取出来的形式是:- PC abbr.个人计算机(=personal computer) <br>1.Maintenance of PC is in my element.<br>我对电脑的维修保养很在行。
复制代码
需要的格式是:- PC abbr.个人计算机(=personal computer) <br>1.Maintenance of PC is in my element.<br>我对电脑的维修保养很在行。
复制代码
作者: flashercs 时间: 2019-11-7 14:23
本帖最后由 flashercs 于 2019-11-9 11:08 编辑
- <#*,:&cls
- @echo off
- pushd "%~dp0"
- Powershell -NoProfile -ExecutionPolicy RemoteSigned -Command ". ([ScriptBlock]::Create((Get-Content -LiteralPath \"%~0\" -ReadCount 0 | Out-String ))) "
- popd
- pause
- exit /b
- #>
- $VerbosePreference = "Continue"
- $inputFile = "单词列表.txt"
- $outputFile = "结果.txt"
- Get-Content -LiteralPath $inputFile -OutBuffer 100 | ForEach-Object -Begin {
- $sw = New-Object -TypeName System.IO.StreamWriter -ArgumentList $outputFile, $false, ([System.Text.Encoding]::Default), 65536
- # webclient settings
- $webclient = New-Object -TypeName System.Net.WebClient
- $webclient.BaseAddress = 'http://dict.cn/'
- $webclient.Encoding = [System.Text.Encoding]::UTF8
- $webclient.Headers.Add("Accept", "text/html, application/xhtml+xml, application/xml; q=0.9, */*; q=0.8")
- $webclient.Headers.Add("Accept-Encoding", "gzip")
- $webclient.Headers.Add("Accept-Language", "en-US, en; q=0.8, zh-Hans-CN; q=0.5, zh-Hans; q=0.3")
- # xml parser
- $xmldoc = New-Object -TypeName System.Xml.XmlDocument
- # re
- $remain = [regex]'(?si)<div\s+class="main"[^>]*>.*?(?=<div\s+class="righter")'
- # $recontent = [regex]'(?si)<div\s+class="word"[^>]*>.*?(?=<div\s+class="section[^"]*"[^>]*>)'
- $rejs = [regex]'(?si)<script[^>]*>.*?</script>'
- # $resent = [regex]'(?si)(?<=<h3[^>]*>例句</h3>).*?(?=<h3)'
- $reXMLEntities = [regex]'(?si)&[^;<]*(;|(?=<|$))'
- $evaluator = {
- param($m)
- $s = $m.Value;
- if ($m.Groups[1].Value -eq '') {
- $s += ';'
- }
- [System.Web.HttpUtility]::HtmlEncode([System.Web.HttpUtility]::HtmlDecode($s))
- } -as [System.Text.RegularExpressions.MatchEvaluator]
- # stringbuilder
- $strbuilder = New-Object -TypeName System.Text.StringBuilder
- Add-Type -AssemblyName System.Web.Extensions
- $JSON = New-Object -TypeName System.Web.Script.Serialization.JavascriptSerializer -ErrorAction Stop
- # $vsaengine = [Microsoft.JScript.Vsa.VsaEngine]::CreateEngine()
- Add-Type -AssemblyName System.Web
- } -Process {
- Write-Verbose "Fetching $_ ..."
- for ($i = 2; $i -ge 0; $i--) {
- try {
- $readstream = $webclient.OpenRead($_)
- Write-Verbose "Fetch $_ success"
- break
- } catch {
- $_ | Out-String | Write-Host -ForegroundColor Red
- }
- }
- if ($readstream) {
- try {
- $gzipstream = New-Object -TypeName System.IO.Compression.GZipStream -ArgumentList $readstream, ([System.IO.Compression.CompressionMode]::Decompress)
- $sr = New-Object -TypeName System.IO.StreamReader -ArgumentList $gzipstream, ([System.Text.Encoding]::UTF8)
- $strhtml = $sr.ReadToEnd()
- $match = $remain.Match($strhtml)
- # div.main matched
- if ($match.Success) {
- Write-Verbose "Match $_ success"
- # convert html to xml
- $strxml = $rejs.Replace($match.Value, '') -replace '(?s)<!--.*?-->' -replace '<([^\x00-\x7e]+)>', '<$1>' -replace '<br>', '<br/>'
- $strxml = $reXMLEntities.Replace($strxml, $evaluator)
- $xmldoc.LoadXml($strxml)
- $strbuilder.Length = 0
- $nodeWord = $xmldoc.DocumentElement.SelectSingleNode('div[@class="word"]')
- # word-cont
- [void]$strbuilder.Append($nodeWord.SelectSingleNode('.//h1[@class="keyword"]/text()').Value).Append("`t")
- # dict-translation
- [void]$strbuilder.Append( ($nodeWord.SelectNodes('.//ul/li[position()<last()]') | ForEach-Object { $_.innerText }) -join " " ).Append("`t")
- # dict-chart
- $nodeChartBasic = $nodeWord.SelectSingleNode('.//div[@id="dict-chart-basic"]/@data')
- # chart basic exist
- if ($nodeChartBasic) {
- $strjson = [System.Uri]::UnescapeDataString($nodeChartBasic.Value)
- $jsobj = $JSON.DeserializeObject($strjson)
- foreach ($field in $jsobj.Keys) {
- [void]$strbuilder.Append($jsobj.Item($field).Item('sense')).Append(':').Append($jsobj.Item($field).Item('percent')).Append(',')
- }
- [void]$strbuilder.Remove($strbuilder.Length - 1, 1)
- }
- [void]$strbuilder.Append("`t")
-
- # 例句
- # $match1 = $resent.Match($strhtml)
- $nodeSent = $xmldoc.DocumentElement.SelectSingleNode('div[@class="section sent"]/h3[text()="例句"]/following-sibling::div')
- if ($nodeSent) {
- try {
- # $xmldoc.LoadXml(($match1.Value -replace '<br>', '<br/>' -replace '<([^\x00-\x7e]+)>', '<$1>'))
- $nodeSent.SelectNodes('ol') | ForEach-Object {
- # 用作形容词 (.adj)
- [void]$strbuilder.Append(($_.PreviousSibling.InnerText -replace '\s+' -replace '\(', ' $&')).Append('<br>')
- $_.SelectNodes('li[position()<3]') | ForEach-Object -Begin { $index = 0 } -Process {
- $index++;
- [void]$strbuilder.Append("$index.$(($_.SelectNodes('text()')|ForEach-Object {$_.Value}) -join '<br>')").Append('<br>')
- }
- }
- [void]$strbuilder.Remove($strbuilder.Length - 4, 4)
- } catch {
- $_ | Out-String | Write-Host -ForegroundColor Red
- }
- } else {
- Write-Verbose "没有例句."
- }
- # output result string
- $sw.WriteLine(($strbuilder.ToString() -replace "[\r\n]+"))
- } else {
- Write-Verbose "Match $_ failed"
- }
- } catch {
- $_ | out-string | Write-Host -ForegroundColor Red
- } finally {
- $readstream.Close()
- Remove-Variable readstream
- if ($gzipstream) {
- $gzipstream.Dispose()
- }
- if ($sr) {
- $sr.Dispose()
- }
- }
- } else {
- $sw.WriteLine($_)
- }
- } -End {
- $sw.Dispose()
- $webclient.Dispose()
- }
复制代码
作者: qixiaobin0715 时间: 2019-11-7 16:13
回复 39# flashercs
已扫码。
极少部分单词出现问题,显示源页面,并且提取不到。比如:face,contact,confront,encounter等。
作者: flashercs 时间: 2019-11-8 17:10
回复 40# qixiaobin0715
改
作者: terse 时间: 2019-11-8 17:47
怎么这么复杂呢 混编的也行吧- @set @i=0 /* & @echo off & cscript.exe -NoLogo -E:JScript %0 <单词列表.txt >结果.txt& pause & exit */
- var xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
- function GetContent(url) {
- xmlhttp.open("GET", url ,false);
- xmlhttp.send();
- return(xmlhttp.responseText);
- };
- function getByClass(tag,Classname){
- if(html.getElementsByClassName){
- return html.getElementsByClassName(Classname);
- }
- var tags = html.getElementsByTagName(tag);
- for(var i = 0,len = tags.length; i < len; i++){
- if( tags[i].className ==Classname){
- return(tags[i]);
- }
- }
- }
- while (!WSH.StdIn.AtEndOfStream) {
- var s = WSH.StdIn.ReadLine();
- var str = s;
- var url = "http://dict.cn/" + str;
- var html = new ActiveXObject("htmlfile");
- html.write(GetContent(url));
- var ul = getByClass("ul","dict-basic-ul");
- if (ul) {
- str += "\t" + ul.innerText.replace(/[\r\n]/gm,'') + "。\t"
- if (html.getElementById("dict-chart-basic")) {
- var obj = new Function("return" + unescape(html.getElementById("dict-chart-basic").data))();
- for(var key in obj ) { str += obj[key].percent > 5 ? obj[key].sense + ":"+ obj[key].percent + "%, " : ""};
- };
- var div = getByClass("div","layout sort");
- if (div) {
- str+= '\t'
- var b = div.getElementsByTagName("b");
- var ol = div.getElementsByTagName("ol");
- for (var i=0; i<ol.length; i++) {
- var s =b[i];
- if (s) { str+= s.innerText + '<br>' };
- var li= ol[i].getElementsByTagName("li");
- for (var j=0, len = li.length; j<len; j++) {
- if (j < 2) {str+= j+1 + '. ' + li[j].innerText + '<br>' };
- };
- };
- WSH.Echo(str.replace(/\r?\n/g,'<br>'));
- };
- };
- else { str += "\t" + "错误" };
- };
复制代码
作者: qixiaobin0715 时间: 2019-11-8 21:34
回复 41# flashercs
完美!!!
作者: qixiaobin0715 时间: 2019-11-8 21:37
回复 42# terse
不错。就是速度稍慢,少部分单词漏提。
作者: qixiaobin0715 时间: 2019-11-8 22:20
回复 38# qixiaobin0715
提取的文件增加制表符对齐相同内容问题,用文本编辑器打开,用正则表达式替换已解决。
作者: terse 时间: 2019-11-8 23:11
回复 44# qixiaobin0715
把漏提的发上来 看看什么问题
作者: qixiaobin0715 时间: 2019-11-9 09:03
回复 46# terse
未能提取的是一些不存在释义常用度分布图的单词,我还是需要提取释义和例句。如:- do
- one
- order
- mine
- communicate
- guarantee
- operator
复制代码
作者: terse 时间: 2019-11-9 10:02
回复 47# qixiaobin0715
将25行 改为下面的试- var ul = getByClass("div","basic clearfix");
复制代码
作者: terse 时间: 2019-11-9 10:19
修正一下- @set @i=0 /* & @echo off & cscript.exe -NoLogo -E:JScript %0 <单词列表.txt >结果.txt& pause & exit */
- var xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
- function GetContent(url) {
- xmlhttp.open("GET", url ,false);
- xmlhttp.send();
- return(xmlhttp.responseText);
- }
- function getByClass(tag,Classname){
- if(html.getElementsByClassName){
- return html.getElementsByClassName(Classname);
- }
- var tags = html.getElementsByTagName(tag);
- for(var i = 0,len = tags.length; i < len; i++){
- if( tags[i].className ==Classname){
- return(tags[i]);
- }
- }
- }
- while (!WSH.StdIn.AtEndOfStream) {
- var s = WSH.StdIn.ReadLine();
- var str = s;
- var url = "http://dict.cn/" + str;
- var html = new ActiveXObject("htmlfile");
- html.write(GetContent(url));
- try {
- var ul = getByClass("div","basic clearfix");
- str += "\t" + ul.innerText.replace(/[\r\n]/gm,'') + "。\t";
- if (html.getElementById("dict-chart-basic")) {
- var obj = new Function("return" + unescape(html.getElementById("dict-chart-basic").data))();
- for(var key in obj ) { str += obj[key].percent > 5 ? obj[key].sense + ":"+ obj[key].percent + "%, " : ""};
- }
- var div = getByClass("div","layout sort");
- if (div) {
- str+= '\t'
- var b = div.getElementsByTagName("b");
- var ol = div.getElementsByTagName("ol");
- for (var i=0; i<ol.length; i++) {
- var s =b[i];
- if (s) { str+= s.innerText + '<br>' };
- var li= ol[i].getElementsByTagName("li");
- for (var j=0, len = li.length; j<len; j++) {
- if (j < 2) {str+= j+1 + '. ' + li[j].innerText + '<br>' };
- }
- }
- }
- }
- catch (e) {str += "\t" + "错误"};
- WSH.Echo(str.replace(/\r?\n/g,'<br>'));
- }
复制代码
作者: flashercs 时间: 2019-11-9 11:27
回复 45# qixiaobin0715
先前我对制表符理解有误,是需要4列数据吧?已修改。
作者: qixiaobin0715 时间: 2019-11-9 13:18
两位大神给出的代码提取结果均符合我期望的结果。谢谢!!!
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |