對於示例數據簡單的錨標記,這個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>
需要注意的是,如果有在輸入一行幾個錨標記,這將包括在腳本底部的外標籤之間的物質,太。如果錨標籤橫跨線路斷開,它將被忽略。我毫不懷疑,有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-12 19:40:51
我不知道如何。 – abby 2013-05-12 19:42:34
正確的方法可能涉及XSLT ... – 2013-05-12 19:47:49