我知道我的问题标题不是那么描述性,但让我在这里解释一下。
我正在尝试使用 HTML::TreeBuilder解析给定的html 文档。现在在这个 html 文档中5,1,ABC,DEF
的值将根据用户提供的值进行验证,如果验证成功,我必须提取href
链接。
所以,我的代码是:
my @tag = $tree->look_down( _tag => 'tr', class => qr{\bepeven\scompleted\b} );
for (@tag) {
query_element($_);
}
sub query_element {
my @td_tag = $_[0]->look_down( _tag => 'td' );
my $num1 = shift @td_tag; #Get the first td tag
my $num2 = shift @td_tag; # Get the second td tag
#Making sure first/second td tag has numeric value
$num1 = $1 if $num1->as_text =~ m!(\d+)! or die "no match found";
$num2 = $1 if $num2->as_text =~ m!(\d+)! or die "no match found";
#Validating that above value's match the user provided value 5 and 1.
if ( $num1 eq '5' && $num2 eq '1' ) {
say "hurray..!!";
#Iterating over rest of the td tag to make sure we get the right link from it.
for (@td_tag) {
#Check if contains ABC and than procede to fetch the download href link.
if ($_->look_down(_tag => 'td', class => qr{[c]}, sub {
$_[0]->as_text eq 'ABC';} )
)
{
my $text = $_->as_text;
say "Current node text is: ", $text; #outputs ABC
#Now from here how do I get the link I want to extract.
}
}
}
}
现在,我的方法是首先从中提取值td tags
并将其与用户指定的值进行匹配,如果它是成功的,而不是寻找另一个用户指定的值,或者ABC or DEF
在我的情况下,ABC
如果它匹配则只提取链接。
现在,标签 containsigABC or DEF
没有固定位置,但它们将位于包含5 and 1
值的标签下方。所以,我曾经$_[0]->as_text eq 'ABC';
检查标签ABC
现在包含在我的树中我目前在text node
ABC 从这里如何提取链接 href i,e 如何向上移动对象树并提取值。
PS:我会在这里尝试 xpath,但 html 元素的位置不是那么明确和结构化。
编辑:
所以,我尝试$_->tag()
并返回td
,但如果我在 td 标签上,那么为什么以下代码不起作用:
my $link_obj = $_->look_down(_tag => 'a') # It should look for `a` tag.
say $link_obj->as_text;
但它给出了以下错误:
Can't call method "as_text" on an undefined value.