2017-03-08 51 views
0

基本上,我已经打开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

你想要得到100或186吗? – ThisSuitIsBlackNot

+0

我试图获得该值(186) – Ultracrepidarian

+0

@AbhiNickz请不要更改问题中原始数据的格式,除非您确定它不会更改解决方案。即使空白也可以在解析事物时发挥作用。 – ThisSuitIsBlackNot

回答

3

这是使用ready分析器的好处的一个很好的例子。

一个用于解析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(或任何类似的东西)。

+0

这个建议确实很好。 – Ilion

+0

太棒了!谢谢!另外,你是否介意向我解释foreach声明?和/或其他什么我可能需要改变,以便与另一个变量做同样的事情?基本上,我需要用同一个HTML文件中的另外十几个变量来做同样的事情。提前谢谢! – Ultracrepidarian

+0

@Ultracrepidarian非常好,很高兴它有帮助:)所以,我会在这是关于什么的基础上添加一个简短的评论。但是我建议你找一些使用'HTML :: TreeBuilder'的灯光教程/例子(我不能在这里写_that_)。我会看看并添加链接。 – zdim

0

监视变量范围。你应该能够通过简单的正则表达式获取它:

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

我还没有机会测试这个,但谢谢!你能否偶然解释一下这段代码片段究竟做了什么?我需要为这些需要提取的信息编写20多个这样的信息,我很想知道它究竟做了什么!谢谢! – Ultracrepidarian

+0

它与您的原始匹配类似,但是括号中的任何内容都会被捕获。一段时间是任何角色的通配符。星号是前一个字符的0或更多,问号强制执行严格匹配,这意味着它将匹配最少的字符。捕获的部分然后被送入变量$值。对于严格的代码,你希望在某个时候用'my'实例化你的变量,但是你可能想在你的循环之外,在你的if语句之前执行。 '我的($ teamNumber,$ value);' – Ilion

相关问题