こんにちは、HTML::TreeBuilder
/を使用HTML::Element
して、Microsoft Word などのプログラムによって生成された不適切な HTML をクリーンアップしています。
例の不適切な HTML のスニペットを考えると、 と の間のテキストを抽出する必要がありmosh="start"
ますmosh="stop"
。これは、コード内の別の場所で設定された任意の属性であることに注意してください。
また、これは単なる例であることに注意してください。唯一の保証は、div
mosh の開始場所と停止場所です。これらはテーブルまたは<p><b>
.
以下のコードはこれを実現しますが、各子にも子があるため、各行は複数回抽出されます。
$MoshText
する必要があります
Good Text can be pattern matched Wanted Text More Wanted TextYet More Wanted Text
しかし、テーブルの後
$MoshText
は
Good Text can be pattern matched Good Text can be pattern matched Good Text can be pattern matched Good Text can be pattern matched
次に、2 つの文字列に分割$MoshText
しm/matched/
、元のテキストが含まれていたオブジェクトをすべて削除する必要があります。
これを実現するために以下のコードを変更するにはどうすればよいですか?
#!/usr/bin/perl
use HTML::TreeBuilder;
use HTML::Element;
my $body =qq(
<body>
<div mosh="start">Div where mosh set to start</div
<div>
<table>
<tr>
<td></td><td</td>
<th>Good Text can be pattern matched</th>
<td></td><td</td>
</tr>
</table
</div>
<p>
<p>
<b>Wanted Text</b>
<br>
<p><b>More Wanted Text</b></p>
<div>
<p><b>Yet More Wanted Text</b></p>
</div>
</p>
<div mosh="stop">Div where mosh set to stop bellow here is not needed</div>
);
my ($MoshText, $Flag);
my @kids = $body->content_list();
while (@kids) {
my $child = shift @kids;
if (ref $child) {
my $Mosh = child->attr("mosh");
if ($Mosh eq "start") {
$Flag = 1;
}
if ($Mosh eq "stop") {
$Flag = 0;
last;
}
if ($Flag == 1) {
my $T = $child->as_trimmed_text;
$MoshText = $MoshText . " " . $T;
}
unshift @kids, $child->content_list;
}
}
print $MoshText . "\n";
編集
元のテキストが含まれていたオブジェクトを削除することの意味を明確にするため に
「Good Text can be pattern matching」を含むテーブルは、テーブルではなく div にする必要があります
面白いのはオブジェクトなので、このオブジェクトを次のような新しい div オブジェクトに置き換えます
my $new = HTML::Element->new('tag','div');
$new->attr('class', 'MyClass');
$new->push_content('Good Text can be pattern matched');
しかし、テーブルの削除と挿入 $new をどのように見つけますか
きれいな出力
<div>
Div where mosh set to start
</div>
<div class ='MyClass'>
Good Text can be pattern matched
</div>
<div class ='AnotherClass' >
Wanted Text More Wanted Text Yet More Wanted Text
</div>
<div mosh="stop">Div where mosh set to stop bellow here is not needed</div>
それがより理にかなっていることを願っています