Board logo

标题: [文本处理] [已解决]批处理怎样从多个shtml文件中提取swf文件网址? [打印本页]

作者: liuxi001    时间: 2011-1-8 03:46     标题: [已解决]批处理怎样从多个shtml文件中提取swf文件网址?

从学习网站下载视频教程,下下来的全是shtml文件,这些文件里面有swf格式视频的网址。怎么从几百个shtml文件里面提取全部的swf视频网址呢

谢谢2楼和3楼的朋友,通过你们的帮助,我得到了文本1.txt。但是文本里面的内容很杂,导入到迅雷只提示有类似“http://www.enet.com.cn/eschool/inforcenter/article.jsp?articleid=20040421304259”的网页文件,swf视频网址导不进来。

能不能只提取的swf网址,像下面这样
http://myarticle.enet.com.cn/images/200409/1094549986327.swf
http://www.enet.com.cn/eschool/includes/zhuanti/ps/flash/k/02.swf
http://www.enet.com.cn/eschool/includes/zhuanti/ps/flash/m/02.swf

上传一个shtml文件样本,网站不能上传shtml,扩展名改成txt了。1.txt也上传了。(附件shtml文件大了,我上传前面一部分吧)

感谢大家热心帮忙!

[ 本帖最后由 liuxi001 于 2011-1-10 20:24 编辑 ]
作者: CUer    时间: 2011-1-8 12:05

  1. grep -h -o "http:.*\.swf" *.shtml | more >1.txt
复制代码

作者: hanyeguxing    时间: 2011-1-8 13:30

grep下载地址:http://bbs.bathome.net/attachment.php?aid=1468
作者: tmplinshi    时间: 2011-1-8 19:19

  1. type "*.shtml" | geturls /e:"'" | findstr /i "\.swf$" >swf_list.txt
复制代码
geturls.exe 下载:
http://bathome.net/thread-10581-1-1.html

geturls.exe 是以 空格英文双引号>< 这四个作为网址的结束分隔符。
如果还有其他分隔符,用 /e:"分隔符" 来指定。例如添加单引号和竖线: /e:"'|"

[ 本帖最后由 tmplinshi 于 2011-1-9 19:14 编辑 ]
作者: asnahu    时间: 2011-1-8 23:49     标题: 回复 2楼 的帖子

不知是否版本问题,运行兄台的代码似乎有很多冗余的内容。俺不太会用grep,一般直接用sed。
  1. sed "s/\x22/\n/g" *.shtml | grep "^http.*zhuanti.*swf$"
复制代码

[ 本帖最后由 asnahu 于 2011-1-9 13:25 编辑 ]
作者: tmplinshi    时间: 2011-1-9 07:43

之前少了一个双引号。。现在加上去了。
作者: CUer    时间: 2011-1-9 11:13     标题: 回复 5楼 的帖子

我用的这个版本:

C:\Test>grep --version
grep (GNU grep) 2.5.1
作者: liuxi001    时间: 2011-1-9 15:36     标题: 回复 9楼 10楼 11楼

用4楼 9楼的方法解决了,谢谢大家。

回2楼CUer:
我也是用的grep (GNU grep) 2.5.1这个版本,生成的txt有很多冗余的内容。

回4楼 11楼 tmplinshi:可以了。
  1. type "*.shtml" | geturls /e:"'" | findstr /i "\.swf$" >swf_list.txt
复制代码
回5楼asnahu :
可以了,不过每一个网址后面都多了一个黑色方块,不知道怎么去掉,不过对导入迅雷没有影响。稍微改了一下?
  1. sed "s/\x22/\n/g" *.shtml | grep "^http.*swf$"  >2.txt
复制代码
每一个swf都会找到的几个相同的网址,怎么删掉多余的?还有最后$有什么用?

回9楼Batcher可以了,去掉了黑色方块。
  1. sed "s/\x22/\n/g" *.shtml | grep "^http.*swf$" | more >2.txt
复制代码

需要同时下sed.exe和grep两个文件




不过有一个问题,用4楼的方法得到的文本每一个网址会出现5次,用9楼的方法得到的文本同一个网址出现3次。
回10楼:是这样用吗?
  1. sed "s/\x22/\n/g" *.shtml | grep "^http.*swf$" | more >2.txt
  2. sed -n 'G; s/\n/&&/; /^\([ -~]*\n\).*\n\1/d; s/\n//; h; P'
复制代码

我试了没有效果。
我完全不懂批处理,你说的直接用wget的-nc(skip downloads that would download to existing files.)参数直接过滤掉重复下载的内容,也不知道该怎么做。


还想请问一下,如果下载下来的是.html .htm或者.txt类型的文件可不可以直接套用上面的代码呀?

[ 本帖最后由 liuxi001 于 2011-1-9 22:25 编辑 ]
作者: Batcher    时间: 2011-1-9 15:53     标题: 回复 8楼 的帖子

这样行吗?
  1. sed "s/\x22/\n/g" *.shtml | grep "^http.*swf$" | more >2.txt
复制代码
$是正则表达式里面的,代表行尾。
作者: asnahu    时间: 2011-1-9 18:08

一般来说,直接用wget的-nc(skip downloads that would download to existing files.)参数直接过滤掉重复下载的内容,或者使用sed的高级命令:
  1. sed -n 'G; s/\n/&&/; /^\([ -~]*\n\).*\n\1/d; s/\n//; h; P'
复制代码

此命令太高级,俺解释不清。-_-!
作者: tmplinshi    时间: 2011-1-9 19:20     标题: 回复 8楼 的帖子

用非 IE 内核浏览器(chrome 和 Opera)编辑帖子时,切换了下“Discuz! 代码模式”和“所见即所得模式”,就出现了很多乱码。。正确的代码是这样的:
  1. type "*.shtml" | geturls /e:"'" | findstr /i "\.swf$" >swf_list.txt
复制代码

作者: liuxi001    时间: 2011-1-9 22:34

刚刚测试下面代码可以做到删除相同行:
  1. @echo off
  2. echo 正在查找文本相同行,请等待.....
  3. (echo 清除重复行后的文件内容:& echo.)>str_.txt
  4. setlocal enabledelayedexpansion
  5. for /f "delims=" %%i in (2.txt) do (
  6.     if not defined %%i set %%i=A & echo %%i>>str_.txt)
  7. echo 清理完毕,清理后的文件保存在:str_.txt
  8. pause>nul
复制代码





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