web-dev-qa-db-ja.com

HTMLファイルのすべてのリンクをBashまたはgrepまたはバッチで削除し、テキストファイルに保存する方法

[〜#〜] html [〜#〜] のファイルがあり、約150個のアンカータグがあります。これらのタグからのリンク、AKA、<a href="*http://www.google.com*"></a>http://www.google.com 部分のみを取得したい。

Grepを実行すると、

cat website.htm | grep -E '<a href=".*">' > links.txt

これは、必要なリンクではなく、見つかった行全体を返すので、 cut コマンドを使用してみました。

cat drawspace.txt | grep -E '<a href=".*">' | cut -d’”’ --output-delimiter=$'\n' > links.txt

それが間違っていること、およびそれが機能しないことを除いて、間違ったパラメータに関するいくつかのエラーが表示されます...だから、ファイルも一緒に渡されるはずだったと仮定します。たぶんcut -d’”’ --output-delimiter=$'\n' grepedText.txt > links.txt

しかし、可能であれば1つのコマンドでこれを実行したかったので... [〜#〜] awk [〜#〜] コマンドを実行しようとしました。

cat drawspace.txt | grep '<a href=".*">' | awk '{print $2}’

しかし、これも実行されません。まだ終わっていないので、もっと情報を求めていました。

私はバッチファイルを書き込もうとしましたが、FINDSTRは内部コマンドでも外部コマンドでもないことを教えてくれました...ですから、環境変数が台無しになっていると仮定し、Windowsにgrepをインストールしようとしたことを修正するのではなく、同じエラーを与えました....

問題は、HTTPリンクを [〜#〜] html [〜#〜] から取り除く正しい方法は何ですか?それにより、私はそれを私の状況に合わせて機能させます。

追伸参照を表示するのに時間がかかりすぎるほど多くのリンク/ Stack Overflowの投稿を読みました。プロセスの複雑さを示すためにサンプルHTMLが必要な場合は、追加します。

また、Shell/batch/grepコマンド/ terminalコマンドを使用するためにMacとPCを交互に切り替えたので、どちらかまたは私を助けます。

私も正しいディレクトリにいることを指摘したい

Enter image description here

HTML:

<tr valign="top">
    <td class="beginner">
      B03&nbsp;&nbsp;
    </td>
    <td>
        <a href="http://www.drawspace.com/lessons/b03/simple-symmetry">Simple Symmetry</a>  </td>
</tr>

<tr valign="top">
  <td class="beginner">
    B04&nbsp;&nbsp;
  </td>
  <td>
      <a href="http://www.drawspace.com/lessons/b04/faces-and-a-vase">Faces and a Vase</a> </td>
</tr>

<tr valign="top">
    <td class="beginner">
      B05&nbsp;&nbsp;
    </td>
    <td>
      <a href="http://www.drawspace.com/lessons/b05/blind-contour-drawing">Blind Contour Drawing</a> </td>
</tr>

<tr valign="top">
    <td class="beginner">
        B06&nbsp;&nbsp;
    </td>
    <td>
      <a href="http://www.drawspace.com/lessons/b06/seeing-values">Seeing Values</a> </td>
</tr>

期待される出力:

http://www.drawspace.com/lessons/b03/simple-symmetry
http://www.drawspace.com/lessons/b04/faces-and-a-vase
http://www.drawspace.com/lessons/b05/blind-contour-drawing
etc.
14
A'sa Dickens
$ sed -n 's/.*href="\([^"]*\).*/\1/p' file
http://www.drawspace.com/lessons/b03/simple-symmetry
http://www.drawspace.com/lessons/b04/faces-and-a-vase
http://www.drawspace.com/lessons/b05/blind-contour-drawing
http://www.drawspace.com/lessons/b06/seeing-values
25
Ed Morton

これにはgrepを使用できます。

grep -Po '(?<=href=")[^"]*' file

新しい二重引用符が表示されるまで、href="の後のすべてを出力します。

あなたの与えられた入力でそれは返します:

http://www.drawspace.com/lessons/b03/simple-symmetry
http://www.drawspace.com/lessons/b04/faces-and-a-vase
http://www.drawspace.com/lessons/b05/blind-contour-drawing
http://www.drawspace.com/lessons/b06/seeing-values

cat drawspace.txt | grep '<a href=".*">'を記述する必要はないことに注意してください。 grep '<a href=".*">' drawspace.txtでのcat の無駄な使用を取り除くことができます。

もう一つの例

$ cat a
hello <a href="httafasdf">asdas</a>
hello <a href="hello">asdas</a>
other things

$ grep -Po '(?<=href=")[^"]*' a
httafasdf
hello
21
fedorqui

私の推測では、お使いのPCまたはMacにはデフォルトでlynxコマンドがインストールされていません(Webから無料で入手できます)が、lynxでは次のようなことができます。

$ lynx -dump -image_links -listonly /usr/share/xdiagnose/workloads/youtube-reload.html

出力:参照

  1. file://localhost/usr/share/xdiagnose/workloads/youtube-reload.html
  2. http://www.youtube.com/v/zeNXuC3N5TQ&hl=en&fs=1&autoplay=1

Http:行をgrepするのは簡単なことです。また、http:行だけを出力するlynxオプションもあります(lynxには多くのオプションがあります)。

4
Michael

triplee のコメントによると、正規表現を使用してHTMLまたはXMLファイルを解析することは本質的に行われていません。 sedawkなどのツールは、テキストファイルの処理に非常に強力ですが、XML、HTML、JSONなどの複雑な構造化データの解析に集約されると、大ハンマーにすぎない。はい、あなたは仕事を終わらせることができますが、時には莫大な費用がかかります。このようなデリケートなファイルを処理するには、よりターゲットを絞ったツールセットを使用して、もう少し巧妙にする必要があります。

XMLまたはHTMLを解析する場合、 xmlstarlet を簡単に使用できます。

XHTMLファイルの場合、次を使用できます。

xmlstarlet sel --html  -N "x=http://www.w3.org/1999/xhtml" \
               -t -m '//x:a/@href' -v . -n

どこ -Nは、もしあればXHTML名前空間を与えます。これは、

<html xmlns="http://www.w3.org/1999/xhtml">

ただし、HTMLページは整形式のXMLではないことが多いため、 tidy を使用して少しクリーンアップすると便利です。上記の例の場合、次のようになります。

$ tidy -q -numeric -asxhtml --show-warnings no <file.html> \
  | xmlstarlet sel --html -N "x=http://www.w3.org/1999/xhtml" \
                   -t -m '//x:a/@href' -v . -n
http://www.drawspace.com/lessons/b03/simple-symmetry
http://www.drawspace.com/lessons/b04/faces-and-a-vase
http://www.drawspace.com/lessons/b05/blind-contour-drawing
http://www.drawspace.com/lessons/b06/seeing-values
1
kvantour

grepを使用して、リンクが含まれるすべての行を抽出し、sedを使用してURLを引き出します。

grep -o '<a href=".*">' *.html | sed 's/\(<a href="\|\">\)//g' > link.txt;
0
Sathish