Board logo

标题: 批处理如何查找含有指定字符的行并按层次建立文件夹? [打印本页]

作者: hmgl    时间: 2010-3-4 11:20     标题: 批处理如何查找含有指定字符的行并按层次建立文件夹?

感谢inittab上尉(他的代码在13楼,已经建立很好的框架)和管理员,现在把要求重新说一遍:

1.下载该页:
  1. http://lnlib.vip.qikan.com/Mag.aspx?issn=1005-0043&year=2009&issue=5
复制代码
,根据页面内容建立一级文件夹(即期刊名,该页"期刊目录"这行):“《电脑爱好者》2009年第5期”,
2.在一级文件夹中建立带序号的二级文件夹(即栏目名:该页有”[“的行中):"000_新视界","001_新人帮","002_稀饭软组织"等。
3.在各二级栏目文件夹下依序号建立三级文件夹(即文章名,页面源码含有/article.aspx?titleid=dnah的行中):如:在“000_新视界”文件夹下建立“000_新闻报”,“001_联想不是冒进是“贸进”等文件夹。
3.下载文章,转为txt,去掉正文以外的内容,保存在同名文件夹中,更名为src.txt。如果文章超过一页,要把各页按顺序合并为src.txt,如:http://lnlib.vip.qikan.com/article.aspx?titleid=dnah20090501,下面还有第二页的链接:http://lnlib.vip.qikan.com/article.aspx?titleid=dnah20090501-1(规律也很明显:第二页的链接是第一页链接-1,以此类推)
4.一个小要求:src.txt最好不要带有黑块
5.小问题:13楼代码中的:sed "s/\/Article\/dnah\//>/g;s/\" target=\"_blank\" class=\"/@ 何解?

最终文件夹结构如下:
\《电脑爱好者》2009年第5期
     \ 000_新视界
            \000_国标UFO能否推行开来\src.txt
            \001_偷菜需要歇菜吗?\src.txt
            \002_揭开迅雷会员、QQ会员超低价地下交易迷局\src.txt
            \003_科幻片成为现实,人机交互让未来零距离\src.txt
    \001_菜鸟集训营
           \000_手机上网,你也需要功能性“饮料”\src.txt
           \001_我要下达USB禁用令!\src.txt
           \002_搞定烦人的等级编号\src.txt
           \003_大硬盘的烦恼——复制加速工具\src.txt
           \004_晋级高手宝典 DIY不再难\src.txt

[ 本帖最后由 hmgl 于 2010-3-17 13:18 编辑 ]
作者: BatCoder    时间: 2010-3-4 13:04

最后一行的行首有没有空格?
你自己“想”出来的数据格式可能会影响代码的运行,能否把原始文件以附件的形式传上来看看?
作者: hmgl    时间: 2010-3-4 13:24

上传最原始的文件,有用的数据已经提取出来放在一楼代码栏中,最后有空行

[ 本帖最后由 hmgl 于 2010-3-6 12:13 编辑 ]
作者: inittab    时间: 2010-3-5 18:10

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=4,5 delims=[]=<>" %%a in ('findstr "article.aspx? [" 1.txt') do (
  3.     set str=%%a
  4.        if "!str:~0,4!"=="dnah" (set dir2=%%b) else set dir1=%%a
  5.        md !dir1!\!dir2!
  6. )
  7. pause
复制代码

作者: hmgl    时间: 2010-3-5 19:05

原帖由 inittab 于 2010-3-5 18:10 发表
@echo off&setlocal enabledelayedexpansion
for /f "tokens=4,5 delims=[]=" %%a in ('findstr "article.aspx? [" 1.txt') do (
    set str=%%a
       if "!str:~0,4!"=="dnah" (set dir2=%%b) else set di ...


谢谢了,写的高度精炼,就是我执行的时候停顿了,可能我其余代码有错。另外我的要求现在不光是建立文件夹,详情请看一楼更改后的内容

[ 本帖最后由 hmgl 于 2010-3-6 12:16 编辑 ]
作者: hmgl    时间: 2010-3-5 23:15     标题: 如何逐行提取含有指定字符的文本,建立带序号的多层文件夹?

本楼内容转移到一楼,方便大家

[ 本帖最后由 hmgl 于 2010-3-6 11:16 编辑 ]
作者: BatCoder    时间: 2010-3-5 23:27

提取含有哪个指定字符的文本?建立什么样的文件夹?

http://bbs.bathome.net/thread-7263-1-1.html
跟这个帖子有什么不同?
作者: hmgl    时间: 2010-3-5 23:53

原帖由 BatCoder 于 2010-3-5 23:27 发表
提取含有哪个指定字符的文本?建立什么样的文件夹?

http://bbs.bathome.net/thread-7263-1-1.html
跟这个帖子有什么不同?


http://bbs.bathome.net/thread-7263-1-1.html的代码是建文件夹,我执行后就停顿了,不知道哪里有错,所以索性把最终要求全贴到1楼,代码最好易读性高,便于学习,修改。

[ 本帖最后由 hmgl 于 2010-3-6 11:19 编辑 ]
作者: inittab    时间: 2010-3-6 11:42

怎么题目又改了。 楼主最好所有要求考虑好。
免得回复跟主题不致,给大家造成困扰。
作者: hmgl    时间: 2010-3-6 12:10

不好意思,本来想一步步请教,不想太麻烦诸位,可是搞不定,所以这次把全部要求贴到这里
作者: inittab    时间: 2010-3-6 12:22

你是不是想提取电脑爱好者的期刊啊,呵呵。
你想达到什么样的效果直接给出结果就可以了,过程和方法可能会有不同。请大家自己去想就行了。
作者: hmgl    时间: 2010-3-6 12:55

原帖由 inittab 于 2010-3-6 12:22 发表
你是不是想提取电脑爱好者的期刊啊,呵呵。
你想达到什么样的效果直接给出结果就可以了,过程和方法可能会有不同。请大家自己去想就行了。


呵呵,被你看破了,最终结果就是要一楼的那个文件夹结构。琢磨了好多天,提问也是围绕这个
作者: inittab    时间: 2010-3-6 16:05

这题有点意思的。花了点时间写,就当练手吧。试试是否符合要求
运行时需要下载好三方工具htox32c.exe  sed.exe放置于相同目录;

  1. @echo off&setlocal enabledelayedexpansion
  2. title "期刊采集器"
  3. :start
  4. set/p qs=请输入电脑爱好者期数:(1-24,按q退出):
  5. if "%qs%"=="q" goto :eof
  6. if %qs% gtr 24 echo\输入有误!!,按任意键重新输入!&pause>nul&goto start
  7. if %qs% leq 0  echo\输入有误!!,按任意键重新输入!&pause>nul&goto start
  8. if not exist 第!qs!期 md 第!qs!期
  9. echo;正在下载,请稍等...
  10. curl -s http://www.qikan.com.cn/MagDetails/1005-0043/2009/%qs%.html | sed -n "/右侧列表内容开始/,/返回新闻时政类期刊按钮开始/p">tmp1.txt
  11. find "本刊文章版于近期发布,您可以阅读原貌版" tmp1.txt >nul && (echo;本期暂未有文字版&goto :eof)
  12. sed "s/\/Article\/dnah\//>/g;s/\" target=\"_blank\" class=\"/@</g;s/^s*$//g" tmp1.txt>tmp2.txt
  13. htox32c /ip tmp2.txt>tmp3.txt 2>nul
  14. echo;建立目录结构并下载处理内容
  15. set/a m=0
  16. for /f "tokens=1,2 delims=@" %%a in (tmp3.txt) do (
  17. if not "%%a"=="" (
  18. if "%%b"=="" (set dir1=00!m!_%%a&set/a m+=1,n=0&md "第!qs!期\!dir1!" 2>nul) else (
  19. set dir2=00!n!_%%b&set/an+=1&md "第!qs!期\!dir1!\!dir2!" 2>nul
  20. curl -s "http://www.qikan.com.cn/Article/dnah/%%a" | sed -n "/rticleReadConText/,/div/p" | sed "1d;/div/d;s/<br>//g;s/\t//g">"第!qs!期\!dir1!\!dir2!\src.txt"
  21. :::::以下两行为调试用,可删除
  22. echo;&echo;======================!%%b===========================================
  23. echo;[DIR]第!qs!期\!dir1!\!dir2!&echo;&type 第!qs!期\!dir1!\!dir2!\src.txt
  24. )
  25. )
  26. )
复制代码

[ 本帖最后由 inittab 于 2010-3-6 16:20 编辑 ]
作者: hmgl    时间: 2010-3-6 17:08

期刊下载器名字不错
好像sed的编码不对,建立文件夹的全是乱码:╡┌1╞┌,换了sed的另一个版本,现在正常,
1.能否直接设定起始ur,比如:http://xmlib.vip.qikan.com/Mag.aspx?issn=1005-0043&year=2008&issue=1,从该页面能否自动提取期刊名年数和期数(在期刊目录那行),作为文件夹名,不是只用期数做文件夹名,该页面含有各年各期的url,批处理能否可以直接将其他各期下载
3.期刊中的文章可能很长,会分为两个甚至更多页面,比如:http://lnlib.vip.qikan.com/article.aspx?titleid=dnah20090501,下面还有第二页面的链接,这两页或者更多的内容能否合并为一个src.txt

[ 本帖最后由 hmgl 于 2010-3-6 18:11 编辑 ]
作者: inittab    时间: 2010-3-6 18:16

最新的win32版 sed 4.2下载。
http://ncu.dl.sourceforge.net/pr ... sed-4.2-1-setup.exe
安装完成后,将
C:\Program Files\GnuWin32\bin
下的所有文件复制到c:\windows\system32 下。批处理所有目录如果有sed.exe ,需要删除。

其他的页面采集的话,需要针对具体情况改动代码(针对性是很强的,不过原理思路差不多的)。
作者: hmgl    时间: 2010-3-7 00:32

原帖由 inittab 于 2010-3-6 18:16 发表
最新的win32版 sed 4.2下载。
http://ncu.dl.sourceforge.net/project/gnuwin32/sed/4.2-1/sed-4.2-1-setup.exe
安装完成后,将
C:\Program Files\GnuWin32\bin
下的所有文件复制到c:\windows\system32 下。批处 ...

1.src.txt带有黑块,见附件
2.希望能处理全文页面:http://lnlib.vip.qikan.com/mag.aspx?issn=1005-0043&amp;year=2009&Issue=5, 源码处理http://www.qikan.com.cn/MagDetails/1005-0043/2009/5.html这类页面没有全文
3.在全文页面中有的文章很长,还有第二页(甚至更多),能否合并为src.txt,比如:http://lnlib.vip.qikan.com/article.aspx?titleid=dnah20090501的第二页是http://lnlib.vip.qikan.com/article.aspx?titleid=dnah20090501-1,能否按规律合并一个src.txt
4.我自己摸索修改了源代码,尝试处理全文页面,发现建立的文件夹全都在一层上还自动加了序号:“000_期刊目录:《电脑爱好者》2009年第23期”,“001_ 1.[新视界]”,“002_ 2. 国标UFO能否推行开来”。如何修改?
作者: namejm    时间: 2010-3-7 13:48

  请楼主把所有的要求更新到顶楼,方便后来人的讨论。若需要体现变更过程,可以保留以前的要求,在顶楼尾部追加最新要求。
作者: inittab    时间: 2010-3-8 13:17

16楼的杂志内容比较完整。由于htox32c生成的格式稍难处理。本次改用vbs脚本混合bat处理html2txt.
代码已经支持自动判断采集分页并合并内容。
如有问题请反馈。代码有点复杂。高手请帮忙优化
  1. @echo off&setlocal enabledelayedexpansion
  2. title "期刊采集器(write by inittab 2010.3)"
  3. rem 多次运行后,如出现“访问过于频繁,请稍后再试”请自行脚本中则修改适当的延时
  4. if exist tmp1.txt del /Q tmp?.txt
  5. echo;set oDOM = WScript.GetObject(WScript.Arguments(0))>htm2txt.vbs
  6. echo;do until oDOM.readyState = ^"complete^">>htm2txt.vbs
  7. echo;WScript.sleep 200>>htm2txt.vbs
  8. echo;loop>>htm2txt.vbs
  9. echo;WScript.Echo oDOM.Body.InnerText>>htm2txt.vbs
  10. :start
  11. set/p qs=请输入电脑爱好者期数:(1-24,按q退出):
  12. if "%qs%"=="q" goto :eof
  13. if %qs% gtr 24 echo\输入有误!!,按任意键重新输入!&pause>nul&goto start
  14. if %qs% leq 0  echo\输入有误!!,按任意键重新输入!&pause>nul&goto start
  15. if not exist 第!qs!期 md 第!qs!期
  16. echo;正在下载,请稍等...
  17. :::以下一行网址修改可采集http://lnlib.vip.qikan.com(要保留%qs%变量)其他杂志内容。
  18. curl -s "http://lnlib.vip.qikan.com/Mag.aspx?issn=1005-0043&Year=2009&Issue=%qs%" | sed -n "/期刊目录/,/客服热线/p">tmp1.txt
  19. :::以下一行为延时,改数字调整延时时间。
  20. ping localhost -n 2 >nul
  21. sed "s/article.aspx?/>/g;s/\" title=\"/@</g;1,2d;/客服/d" tmp1.txt>tmp2.txt
  22. htox32c /ip tmp2.txt>tmp3.txt 2>nul
  23. echo;建立目录结构并下载处理内容
  24. set/a m=0
  25. for /f "tokens=2,* delims=.@[] " %%a in (tmp3.txt) do (
  26. if "%%b"=="" (set var=00!m!&set dir1=!var:~-3!_%%a&set/a m+=1,n=0&md "第!qs!期\!dir1!" 2>nul) else (
  27. set var=00!n!&set dir2=!var:~-3!_%%b&set/an+=1&md "第!qs!期\!dir1!\!dir2!" 2>nul
  28. set "url=http://lnlib.vip.qikan.com/article.aspx?%%a"
  29. cscript //NoLogo //e:vbscript htm2txt.vbs "!url!" | sed -n "/^首页/,/存入我的阅览室/p" | sed "s/首页 ->//g;s/字体.*//g">tmp1.txt
  30. ping localhost -n 1 >nul
  31. findstr /C:"[2]" tmp1.txt | sed "s/[^2-9 ]//g">tmp2.txt
  32. set str=&set/p str=<tmp2.txt
  33. for %%i in (!str!) do (
  34. set/a subnum=%%i-1&cscript //NoLogo //e:vbscript htm2txt.vbs "!url!-!subnum!" | sed -n "/^首页/,/存入我的阅览室/p" | sed "/首页 ->/d">>tmp1.txt
  35. ping localhost -n 1 >nul
  36. )
  37. sed "/存入我的阅览室/d" tmp1.txt>"第!qs!期\!dir1!\!dir2!\src.txt"
  38. :::::以下两行为调试用,可删除
  39. echo;&echo;======================第!qs!期\!dir1!\!dir2!===========================================
  40. type "第!qs!期\!dir1!\!dir2!\src.txt"
  41. )
  42. )
  43. :::::清理临时文件
  44. del /Q tmp?.txt&echo;本期内容采集完毕!!!
复制代码

[ 本帖最后由 inittab 于 2010-3-9 11:13 编辑 ]
作者: hmgl    时间: 2010-3-8 19:11

源码测试了一下,为何生成的src.txt用记事本打开带黑块?经常会出现找不到指定路径的提示,怀疑是没有找到分页的文章,还有可能是建立文件夹时因为含有违禁字符,没有建成。另外文件夹前加序号总共三位(000到999,不应该出现”0010“。批处理中间停滞不前,怀疑是下载速度过快,被封,最好能限速并设置代理,htm2txt.vbs能否实现?
作者: inittab    时间: 2010-3-9 10:21

我测试时很正常没有黑块问题(win7 联想OEM旗舰正版)。可能是你的记事本编码不对或sed版本有问题。请用ansi编码记事本试试。推荐最好用editplus文本编辑器,html转txt用的是借用了vbs代码(相对htox32c转换更干净一些,但vbs速度比htox32c要慢不少)
“经常会出现找不到指定路径的提示”。原因已找到,是type 后边路径空有空格引起,这种情况需要将路径用“”括起来就ok了,对采集内容没影响。
0010的问题,是一时大意。已修正。  
增加下载延时(会减慢采集速度,看情况调整数字大小),以防快速访问下载被封。增加过滤“存入我的阅览室”
另外发现sed -i 会生成大量的临时文件,不好用,还是重定向好些。
节省资源,在上上上楼修改。

[ 本帖最后由 inittab 于 2010-3-9 11:24 编辑 ]
作者: BatCoder    时间: 2010-3-9 11:27     标题: 回复 20楼 的帖子

是的,sed -i表面上是直接修改原文件,实际上后台也是通过临时文件来实现的,只是这个过程没有让用户看到而已。
作者: hmgl    时间: 2010-3-9 15:59

更换sed版本,src.txt无黑块,ping localhost 那句中2改为20测试一次,处理到这页停顿:http://lnlib.vip.qikan.com/article.aspx?titleid=dnah200901102,怀疑是该页的图片代码或者是延时不够造成程序停滞,屏幕见下图。改成50再试试。另外因为需要延时下载,不知道何时能下完,才能再下另一期(无法双开),源代码只能选择09年的一期(有些期不存在,程序就在做无用功),能否增加一个选择,自动解析页面,下载页面所包含的各年各期("http://lnlib.vip.qikan.com.cn/mag.aspx?issn=1005-0043&year=2009&Issue=23"含有issn=1005-0043&Year=200*&Issue=*的url),依顺序保存在“000_200*年第*期”,"001_200*年第*期"文件夹中,其下的目录结构和文件夹命名规则不变,这样的话也便于测试各个页面。源代码文章页面是用htm2txt.vbs下载,是不是没有curl功能丰富(可限速,可延时,可用代理,可续传,这些好像强于htm2txt.vbs),能否用curl下载后再用vbs处理?

第二次测试出现下列提示,文件夹中的src.txt内容为空,原因不明。再试一次再说
作者: inittab    时间: 2010-3-10 11:11

可能是访问过快网页被封了. 自已手动打开此网页,是不是出现"问过于频繁,请稍后再试"的图片?
adsl的话重启一下路由,换个IP地址就可以解除.
作者: hmgl    时间: 2010-3-11 22:30

测试下列网页时,建立文件夹出错,
http://lnlib.vip.qikan.com/mag.aspx?issn=1005-0043&year=2009&Issue=23




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2