基本上,我在perl中打开了一个HTML文件,并写了这一行:
if(INFILE =~ \$txt_TeamNumber\) {
$teamNumber = \$txt_TeamNumber\
}
我需要获取txt_TeamNumber,向前移动21个空格,并获得接下来的1-5个数字。以下是我试图从以下信息中提取信息的HTML文件的一部分:
<td style="width: 25%;">Team Number:
</td>
<td style="width: 75%;">
<input name="ctl00$ContentPlaceHolder1$txt_TeamNumber" type="text" value="186" maxlength="5" readonly="readonly" id="ctl00_ContentPlaceHolder1_txt_TeamNumber" disabled="disabled" tabindex="1" class="aspNetDisabled" style="width:53px;">
</td>
答案 0 :(得分:3)
这是使用现成解析器的好处的一个很好的例子。
解析HTML的标准模块之一是HTML::TreeBuilder。它的有效性在很大程度上取决于它对HTML::Element的良好使用,因此总是准备好该页面。
问题并未说明HTML的来源。为了测试,我把它放在一个文件中,用所需的标签包装,然后从该文件加载它。我希望它来自互联网,请相应更改。
use warnings;
use strict;
use Path::Tiny;
use HTML::TreeBuilder;
my $file = "snippet.html";
my $html = path($file)->slurp; # or open and slurp by hand
my $tree = HTML::TreeBuilder->new_from_content($html);
my @nodes = $tree->look_down(_tag => 'input');
foreach my $node (@nodes) {
my $val = $node->look_down('name', qr/\$txt_TeamNumber/)->attr('value');
print "'value': $val\n";
}
这将打印行:'value': 186
。请注意,我们根本不需要解析任何内容。
我认为'name'
属性由文字 $txt_TeamNumber
标识,因此$
会被转义。
该代码使用了优秀的Path::Tiny到slurp
文件。如果安装模块存在问题,请手动将文件读入字符串。我想它无论如何都是从互联网上取下的。
有关模块的完整实用程序,请参阅文档和丰富的其他示例。当然还有其他方法和方法,可供优秀模块使用。请搜索合适的工具。
我强烈建议清除任何想法用正则表达式解析HTML(或类似的东西)。
答案 1 :(得分:0)
注意变量范围。你应该能够通过一个简单的正则表达式捕获来获得它:
if(INFILE =~ /$txt_TeamNumber/) {
$teamNumber = /$txt_TeamNumber/
($value) = /$txt_TeamNumber.*?value="(.*?)"/
}