以下のコードを使用する前に、HTMLソースからURLリストをgrepすることができましたが、何らかの理由でこの特定の例では機能しません。
グレブ:
grep -1 box-download shareit1.txt|sed 's/<a/\/n/'|sed 's/href/\/n/'|grep http|cut -d\" -f2>> shareit2.txt
URL:
<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=6970397 364906 &S ignnatural=SdKSfTDHY4dG6HVu2--lqt8lRbGK9S1opIDZiSNwvggAAAXB3hESz1G1Y00rU5iLGY5la i0YOJBXhE4y6gvL4uQvCV4 KfrWdD06gBlVrqE 49A eeotENtdA3SpkmfQGGd1tnjS138_&キーペア -Id=APKAJUA62FNWTI37JTGQ&ファイル名=LenovoShareIt-win.exe
答え2
sed 's/^[^"]* *//
s/" */"\n/2
/\n/P;D
' <in >out
これは、一度に1つの二重引用符のコンテキストで入力行を交互に印刷して食べます。データをより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
。 2番目は " /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を使用することです。問題は、シェルにDOMパーサーがなく(私が知っている限り)、通常のシェルXMLパーサーを使用すると、ファイルが有効なXMLになると期待するXPath式を指定できることです。ウェブサイトのコンテンツはほとんどそうではありません。 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
。