我有一组html文件,我必须在<hr>
和</hr>
标签之间提取内容。除了这个提取,我已经完成了所有工作。我做的是
1.加载所有html文件并将其存储在@html_files
。
2.然后我将每个文件的内容存储在@useful_files
数组中。
3.然后我循环@useful_files
数组并检查找到<hr>
的每一行。如果发现我需要@elements
数组中的下一行内容。
有可能。我在右边吗?
foreach(@html_files){
$single_file = $_;
$elemets = ();
open $fh, '<', $dir.'/'.$single_file or die "Could not open '$single_file' $!\n";
@useful_files = ();
@useful_files = <$fh>;
foreach(@useful_files){
$line = $_;
chomp($line);
if($line =~ /<hr>/){
@elements = $line;
}
}
create(@elements,$single_file)
}
谢谢!!!
我的输入html文件将是这样的
<HR SIZE="3" style="COLOR:#999999" WIDTH="100%" ALIGN="CENTER">
<P STYLE="margin-top:0px;margin-bottom:0px; text-indent:4%"><FONT STYLE="font-family:Times New Roman" SIZE="2">Lorem ipsum dolor sit amet, consectetur adipiscing elit. </FONT></P>
<P STYLE="font-size:12px;margin-top:0px;margin-bottom:0px"> </P>
<TABLE CELLSPACING="0" CELLPADDING="0" WIDTH="100%" BORDER="0" STYLE="BORDER-COLLAPSE:COLLAPSE">
<TR>
<TD WIDTH="45%"></TD>
<TD VALIGN="bottom" WIDTH="1%"></TD>
<TD WIDTH="4%"></TD>
<TD VALIGN="bottom"></TD>
<TD WIDTH="4%"></TD>
<TD VALIGN="bottom" WIDTH="1%"></TD>
<TD WIDTH="44%"></TD></TR>
<TR>
<TD VALIGN="top"></TD>
<TD VALIGN="bottom"><FONT SIZE="1"> </FONT></TD>
<TD VALIGN="bottom"></TD>
<TD VALIGN="bottom"><FONT SIZE="1"> </FONT></TD>
<TD VALIGN="bottom"><FONT STYLE="font-family:Times New Roman" SIZE="2">Title:</FONT></TD>
<TD VALIGN="bottom"><FONT SIZE="1"> </FONT></TD>
<TD VALIGN="bottom"><FONT STYLE="font-family:Times New Roman" SIZE="2">John</FONT></TD></TR>
</TABLE>
<p Style='page-break-before:always'>
<HR SIZE="3" style="COLOR:#999999" WIDTH="100%" ALIGN="CENTER">
我在这里复制的html代码只是样本。我需要<hr>
数组中@elements
之间的确切内容。
答案 0 :(得分:1)
最简单的方法是:
my @cont;
foreach (@ARGV) {
open my $fh,'<',$_;
push @cont,join('',map { chomp; $_ } <$fh>)=~m%<hr>(.*?)</hr>%g;
}
#print join("\n",@cont,'');
是的,不要担心:所有文件将在退出时自动关闭&#34;自动&#34; :)
提示:取消注释print语句以查看结果。
答案 1 :(得分:1)
您可以在命令行中使用grep:
grep -Pzo '<hr>\K((.|\n)*)(?=</hr>)' file.html
即使有新的行,也可以在<hr>
和</hr>
之间提取任何内容。
示例:
tiago@dell:/tmp$ grep -Pzo '<hr>\K((.|\n)*)(?=</hr>)' <<< '<hr>a b c d </hr>'
a b c d
tiago@dell:/tmp$ grep -Pzo '<hr>\K((.|\n)*)(?=</hr>)' <<< $'<hr>a b\nc d </hr>'
a b
c d
当然,你可以对多个文件运行grep。
答案 2 :(得分:0)
我知道有人说不用正则表达式来解析HTML,但这似乎是一种相对简单的任务,可以保证使用正则表达式。
试试这个:
if ($line =~ m/<hr>(.*?)<\/hr>/){
push @elements, $1;
}
这将在<hr>
和</hr>
之间提取文本,并将其存储在@elements数组的下一个索引中。
此外,您应始终在代码顶部use strict;
和use warnings;
!这将阻止你犯下愚蠢的错误,并防止许多不必要的头痛。
在完成将其内容提取到@useful_files
数组后,您还应关闭文件! close $fh;
(另一方面,这个数组的名称是误导性的。我建议你将它命名为@lines
或@file_contents
,因为它包含单个文件的内容......不是多个文件作为您的变量名称似乎暗示。)