如何在右侧获得一些数字?

时间:2017-03-08 21:14:55

标签: html perl

基本上,我在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>

2 个答案:

答案 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::Tinyslurp文件。如果安装模块存在问题,请手动将文件读入字符串。我想它无论如何都是从互联网上取下的。

有关模块的完整实用程序,请参阅文档和丰富的其他示例。当然还有其他方法和方法,可供优秀模块使用。请搜索合适的工具。

我强烈建议清除任何想法用正则表达式解析HTML(或类似的东西)。

答案 1 :(得分:0)

注意变量范围。你应该能够通过一个简单的正则表达式捕获来获得它:

if(INFILE =~ /$txt_TeamNumber/) {
    $teamNumber = /$txt_TeamNumber/
    ($value) = /$txt_TeamNumber.*?value="(.*?)"/
}