尝试使用 sed 从 .txt 文件中的 html 源 grep url

尝试使用 sed 从 .txt 文件中的 html 源 grep url

我之前已经能够使用下面的代码从 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&amp;channel=WEB&amp;fdh=no&amp;id_file=69703978&amp;instance=softonic_en&amp;type=PROGRAM&amp;Expires=1444364906&amp;Signature=SdKSfTDHY4dG6HVu2--lqt8lRbGK9S1opIDZiSNwvggAAAXB3hESz1G1Y00rU5iLGY5lai0YOJBXhE4y6gvL4uQvCV4U5jzLDU9TmFTxe4xNDrEmkSC95LyGdGSudQKfrWdD06gBlVrqE49AeeotENtdA3SpkmfQGGd1tnjS138_&amp;Key-Pair-Id=APKAJUA62FNWTI37JTGQ&amp;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&amp;channel=WEB&amp;fdh=no&amp;id_file=69703978&amp;instance=softonic_en&amp;type=PROGRAM&amp;Expires=1444364906&amp;Signature=SdKSfTDHY4dG6HVu2--lqt8lRbGK9S1opIDZiSNwvggAAAXB3hESz1G1Y00rU5iLGY5lai0YOJBXhE4y6gvL4uQvCV4U5jzLDU9TmFTxe4xNDrEmkSC95LyGdGSudQKfrWdD06gBlVrqE49AeeotENtdA3SpkmfQGGd1tnjS138_&amp;Key-Pair-Id=APKAJUA62FNWTI37JTGQ&amp;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&amp;channel=WEB&amp;fdh=no&amp;id_file=69703978&amp;instance=softonic_en&amp;type=PROGRAM&amp;Expires=1444364906&amp;Signature=SdKSfTDHY4dG6HVu2--lqt8lRbGK9S1opIDZiSNwvggAAAXB3hESz1G1Y00rU5iLGY5lai0YOJBXhE4y6gvL4uQvCV4U5jzLDU9TmFTxe4xNDrEmkSC95LyGdGSudQKfrWdD06gBlVrqE49AeeotENtdA3SpkmfQGGd1tnjS138_&amp;Key-Pair-Id=APKAJUA62FNWTI37JTGQ&amp;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.

相关内容