我之前已经能够使用下面的代码从 html 源中 grep url 列表,但由于某种原因,它不适用于这个特定的示例。
格列普:
grep -1 box-download shareit1.txt|sed 's/<a/\/n/'|sed 's/href/\/n/'|grep http|cut -d\" -f2>> shareit2.txt
网址:
<div class="box-download">
<a data-no-file="0" title="SHAREit free download" href="http://gsf-cf.softonic.com/c98/1a8/173dd01ec9001985d81eb5f2023b03280c/LenovoShareIt-win.exe?SD_used=0&channel=WEB&fdh=no&id_file=69703978&instance=softonic_en&type=PROGRAM&Expires=1444364906&Signature=SdKSfTDHY4dG6HVu2--lqt8lRbGK9S1opIDZiSNwvggAAAXB3hESz1G1Y00rU5iLGY5lai0YOJBXhE4y6gvL4uQvCV4U5jzLDU9TmFTxe4xNDrEmkSC95LyGdGSudQKfrWdD06gBlVrqE49AeeotENtdA3SpkmfQGGd1tnjS138_&Key-Pair-Id=APKAJUA62FNWTI37JTGQ&filename=LenovoShareIt-win.exe" id="download-button" class="button-main-download-xl"
data-ua="#c,#l,a=Download,downloadType=HostedDownload"
>
<strong>Free Download
<span>Safe download</span>
</strong>
<i class="icon-download-alt"></i>
</a>
感谢您的帮助。
答案1
有了这个(固定的)file.html:
<html>
<div class="box-download">
<a data-no-file="0" title="SHAREit free download" href="http://gsf-cf.softonic.com/c98/1a8/173dd01ec9001985d81eb5f2023b03280c/LenovoShareIt-win.exe?SD_used=0&channel=WEB&fdh=no&id_file=69703978&instance=softonic_en&type=PROGRAM&Expires=1444364906&Signature=SdKSfTDHY4dG6HVu2--lqt8lRbGK9S1opIDZiSNwvggAAAXB3hESz1G1Y00rU5iLGY5lai0YOJBXhE4y6gvL4uQvCV4U5jzLDU9TmFTxe4xNDrEmkSC95LyGdGSudQKfrWdD06gBlVrqE49AeeotENtdA3SpkmfQGGd1tnjS138_&Key-Pair-Id=APKAJUA62FNWTI37JTGQ&filename=LenovoShareIt-win.exe" id="download-button" class="button-main-download-xl" data-ua="#c,#l,a=Download,downloadType=HostedDownload">
<strong>Free Download<span>Safe download</span></strong>
<i class="icon-download-alt"></i>
</a>
</div>
</html>
命令:
xmlstarlet sel -t -v "//html/div/a/@href" file.html
输出:
http://gsf-cf.softonic.com/c98/1a8/173dd01ec9001985d81eb5f2023b03280c/LenovoShareIt-win.exe?SD_used=0&channel=WEB&fdh=no&id_file=69703978&instance=softonic_en&type=PROGRAM&Expires=1444364906&Sign自然=SdKSfTDHY4dG6HVu2--lqt8lRbGK9S1opIDZiSNwvggAAAXB3hESz1G1Y00rU5iLGY5la i0YOJBXhE4y6gvL4uQvCV4U5jzLDU9TmFTxe4xNDrEmkSC95LyGdGSudQKfrWdD06gBlVrqE49A eeotENtdA3SpkmfQGGd1tnjS138_&密钥对-Id=APKAJUA62FNWTI37JTGQ&文件名=LenovoShareIt-win.exe
答案2
sed 's/^[^"]* *//
s/" */"\n/2
/\n/P;D
' <in >out
这将轮流打印和吃掉输入行,一次一个双引号上下文。它可能会让你的数据更加grep
友好。正如所写,如果引用的上下文可以跨越换行符,那么它不起作用,但是,据我所知,它们不应该在 HTML 中。
不管怎样,它确实让你的样本更容易处理:
class="box-download"
data-no-file="0"
title="SHAREit free download"
href="http://gsf-cf.softonic.com/c98/1a8/173dd01ec9001985d81eb5f2023b03280c/LenovoShareIt-win.exe?SD_used=0&channel=WEB&fdh=no&id_file=69703978&instance=softonic_en&type=PROGRAM&Expires=1444364906&Signature=SdKSfTDHY4dG6HVu2--lqt8lRbGK9S1opIDZiSNwvggAAAXB3hESz1G1Y00rU5iLGY5lai0YOJBXhE4y6gvL4uQvCV4U5jzLDU9TmFTxe4xNDrEmkSC95LyGdGSudQKfrWdD06gBlVrqE49AeeotENtdA3SpkmfQGGd1tnjS138_&Key-Pair-Id=APKAJUA62FNWTI37JTGQ&filename=LenovoShareIt-win.exe"
id="download-button"
class="button-main-download-xl"
data-ua="#c,#l,a=Download,downloadType=HostedDownload"
class="icon-download-alt"
答案3
它不能工作,因为你有向后的斜杠(除非有 StackExchange 解析器把事情搞砸了)。您已经发现,为了选择属性内容,您将把它放入新行并从那里剪切。但换行符是\n
,不是\/n
。第二个是“ /n
,确保正斜杠按字面意思处理”。
因此,修复后此代码将起作用:
grep -1 box-download shareit1.txt|sed 's:<a:\n:'|sed 's/href/\n/'|grep http |cut -d\" -f 2
尽管您可以仅依靠以下方法来减少管道和外部程序调用的数量sed
:
sed -n -e '/http/ s:.*href="\([^"]*\)".*:\1: p' shareit1.txt
顺便说一句,所有这些方法无论如何都是错误的。正确的方法是使用 DOM/XPath。问题是,shell 没有 DOM 解析器(据我所知),通用 shell XML 解析器允许指定 XPath 表达式,期望文件是有效的 XML,而网站内容几乎从来都不是。在其他编程语言中,例如 Python、Ruby 或 Perl(提及系统管理员最常用的语言),有一些库可以将杂乱的 HTML 文件转换为类似于有效 XML 文件的内容,并可以将其输入 XML 解析器。
答案4
您可以使用小狗;这是一个了不起的工具。
在这里,了解如何下载文件,然后将 HTML 内部的特定链接添加到文件中。
wget http://domain.com -O file.html && pup 'a.className[href] attr{href}' < file.html > links.md
Domain.com 上带有类名的所有链接都className
将被下载并保存到名为links.md
.