我正在下载一个系列的剧集,但我厌倦了加入该网站、复制链接并下载每一集。
首先,我加入网站并获取 HTML 代码。代码很长,但我对此特别感兴趣(这是链接所在的地方)
var e=Array(),d=1;e[1]='<div style="margin-left:7px"><object width="720" height="450" class="BLOG_video_class" id="BLOG_video-ee57f234e359092e" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="movie" value="//www.youtube.com/get_player"><param name="bgcolor" value="#FFFFFF"><param name="allowfullscreen" value="true"><param name="flashvars" value="flvurl=http://redirector.googlevideo.com/videoplayback?id%3Da87eff0521883521%26itag%3D5%26source%3Dblogger%26app%3Dblogger%26cmo%3Dsensitive_content%253Dyes%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1400695090%26sparams%3Did,itag,source,ip,ipbits,expire%26signature%3DAA6B72C5D9C12D461C7A0E3F59B2C208A7CDC82D.AE374E37E58A41191B10F30AA43BE42379DA6D5B%26key%3Dck2&iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3Da87eff0521883521%26offsetms%3D5000%26itag%3Dw160%26sigh%3DaUKIa9j5GROOBShBybzlFhMGllc&autoplay=0"><embed src="//www.youtube.com/get_player" type="application/x-shockwave-flash"width="720" height="450" bgcolor="#FFFFFF"flashvars="flvurl=http://redirector.googlevideo.com/videoplayback?id%3Da87eff0521883521%26itag%3D5%26source%3Dblogger%26app%3Dblogger%26cmo%3Dsensitive_content%253Dyes%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1400695090%26sparams%3Did,itag,source,ip,ipbits,expire%26signature%3DAA6B72C5D9C12D461C7A0E3F59B2C208A7CDC82D.AE374E37E58A41191B10F30AA43BE42379DA6D5B%26key%3Dck2&iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3Da87eff0521883521%26offsetms%3D5000%26itag%3Dw160%26sigh%3DaUKIa9j5GROOBShBybzlFhMGllc&autoplay=0"allowFullScreen="true" /></object></div>';e[2]='<div style="margin-left:7px"><iframe src="http://videosasd.com/play-zs-www30.zippyshare.com/v/94301695/file.html" width="720" height="450" scrolling="no" frameborder="0"></iframe></div>';
好吧,这是一个很长的代码,但我有兴趣得到它。(有两个相同的链接,都可以在末尾不带“&”的情况下工作)
http://redirector.googlevideo.com/videoplayback?id%3Da87eff0521883521%26itag%3D5%26source%3Dblogger%26app%3Dblogger%26cmo%3Dsensitive_content%253Dyes%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1400695090%26sparams%3Did,itag,source,ip,ipbits,expire%26signature%3DAA6B72C5D9C12D461C7A0E3F59B2C208A7CDC82D.AE374E37E58A41191B10F30AA43BE42379DA6D5B%26key%3Dck2&
现在,我正在使用这个正则表达式(注意,我对此很陌生,我测试过它并且可以工作)
\s*flvurl\s*=\s*(\"([^"]*\")|'[^']*'|([^'">\s]+));*%26key%3Dck2&
在终端中我使用
wget -q -O - "serverlink" | sed -e "s/\s*flvurl\s*=\s*(\"([^"]*\")|'[^']*'|([^'">\s]+));*%26key%3Dck2&//g"
我收到错误unexpected token
)''
有人知道我该如何修复它吗?(或者,也许有人知道一个更好的正则表达式来从第一个代码框获取链接)
答案1
这里有一些更简单的方法来获得你想要的东西:
grep
和PCRE 函数wget -q -O - "serverlink" | grep -oP 'flvurl=\K[^;]+(?=&)'
解释
在 PCRE 中,
\K
平均值“丢弃到这里为止的所有匹配项”.-o
选择grep
意味着“仅打印字符串的匹配部分”。因此,grep -oP 'flvurl=\K
意味着:“寻找flvurl=
并开始匹配后它。”办法[^;]+
“匹配;
尽可能多的非字符。该
foo(?=bar)
格式称为积极展望。它不是实际匹配字符串的一部分。它的意思是 _“匹配foo
后跟bar
但丢弃bar
。将所有这些放在一起,上面的正则表达式将打印flvurl=
和之间的所有内容&
。sed
wget -q -O - "serverlink" | sed -nr 's/.*flvurl=([^;]+)&.*/\1/p'
解释
替换运算符(我使用传统的,
s///
而不是s\\\
您使用的,但想法相同)将用 和 之间的文本替换所有内容flvurl=
。&
括号用于“捕获”匹配的字符串,使其可用作\1
。该-r
选项启用扩展正则表达式它可以处理括号而不需要转义 (\(
和\)
)。顺便说一句,这就是您收到错误的原因。禁止正常输出
-n
,默认情况下不会打印任何行。p
替换末尾的 (s///p
) 表示“如果替换成功则打印当前行”。Perl
使用与上述相同的逻辑
sed
:wget -q -O - "serverlink" | perl -ne 's/.*flvurl=([^;]+)&.*/$1/ && print'
答案2
您的命令行正在将 wget 的输出导入 sed - 以便替换结果sed 命令的 URL争论在 wget 命令行上,你需要执行类似以下操作
wget -q -O- -- $(echo -n "urlstring" | sed -e 's/pattern/replacement/')
或者
wget -q -O- -- $(sed -e 's/pattern/replacement/' <<< "urlstring")
在此上下文中可以-e
省略。