您好,我正在使用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
然后我需要拆分成两个字符串并删除原始文本所在的任何对象$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>
希望这更有意义