0

を使用して取得したhtmlファイルがありますwget。すべてのリンク、つまり all<a href=""> </a>をファイルの最後に配置したい。出来ますか?

たとえば、次のファイルについて考えてみます。

<tr style="background-color: #EFEFEF">
    <td valign="top">Line1<br />2013.05.23</td>
    <td>Line2
    <br /><a href="link.html">link</a>
    <br />Line3
    </td>
</tr>

テキストを次のように変更したいと思います。

<tr style="background-color: #EFEFEF">
    <td valign="top">Line1<br />2013.05.23</td>
    <td>Line2
    <br />
    <br />Line3
    </td>
</tr>
<a href="link.html">link</a>
4

2 に答える 2

2

サンプル データの単純なアンカー タグの場合、次の Perl スクリプトで十分です。

#!/usr/bin/env perl
use strict;
use warnings;

my @urls = ();

while (<>)
{
    chomp;
    if (m/\s*(<a\s+[^>]+>.*<\/a>)\s*/)
    {
        push @urls, $1;
        s///;
    }
    print "$_\n";
}

foreach my $url (@urls)
{
    print "$url\n";
}

出力例:

<tr style="background-color: #EFEFEF">
    <td valign="top">Line1<br />2013.05.23</td>
    <td>Line2
    <br />
    <br />Line3
    </td>
</tr>
<a href="link.html">link</a>

入力の 1 行に複数のアンカー タグがある場合は、スクリプトの下部にある外側のタグの間にある素材も含まれることに注意してください。アンカー タグが複数の行にまたがっている場合、それは無視されます。このスクリプトを破る可能性のある HTML 表記法があることに疑いの余地はありません (ただし、それが何であるかはわかりません)。

これは、単純なスクリプトからの小さなステップアップです。

#!/usr/bin/env perl
use strict;
use warnings;

my @urls = ();

while (<>)
{
    chomp;
    while (m/\s*(<a\s+[^>]+>.*?<\/a>)\s*/)
    {
        push @urls, $1;
        s// /;
    }
    print "$_\n";
}

foreach my $url (@urls)
{
    print "$url\n";
}

while代わりのループはif、行内の一致を繰り返します。貪欲.*?でない量指定子は、中間のアンカー タグを取り込まないことを意味します。代用は、削除された素材を空白に置き換えるため、アンカー タグを分離する単語を分離したままにします。

サンプルデータ:

<tr style="background-color: #EFEFEF">
    <td valign="top">Line1<br />2013.05.23</td>
    <td>Line2
    <br /><a href="link.html">link</a>
    <br />Line3
    </td>
</tr>
<tr style="background-color: #EFEFEF">
    <td valign="top">Line1<br />2013.05.23</td>
    <td>Line2
    <br /> <a href="link2.html">link</a> extraneous material <a href="link3.html">link</a> other notes <a href="link4.html">link</a>
    <br />Line3
    </td>
</tr>

出力例:

<tr style="background-color: #EFEFEF">
    <td valign="top">Line1<br />2013.05.23</td>
    <td>Line2
    <br /> 
    <br />Line3
    </td>
</tr>
<tr style="background-color: #EFEFEF">
    <td valign="top">Line1<br />2013.05.23</td>
    <td>Line2
    <br /> extraneous material other notes 
    <br />Line3
    </td>
</tr>
<a href="link.html">link</a>
<a href="link2.html">link</a>
<a href="link3.html">link</a>
<a href="link4.html">link</a>

これがあなたの目的にとって十分かどうかを判断することができます。少なくとも、取り組むべき何かを与えてくれます。

于 2013-05-12T20:42:20.970 に答える
2

リンクをファイルの末尾にコピーする(移動しない)だけの場合は、簡単に実行できますgrep(もちろん、特殊なケースでは機能しない可能性があります)。

grep -o -P '(<a href=.*?</a>)' test.html > tmp.html && cat tmp.html >> test.html
于 2013-05-12T20:44:39.133 に答える