我正在尝试让XPath返回一个属性值,然后首先搜索标签的内容,即如果我有
<select name="xxx">
<option=bla>123</option>
<option=blubb>456</option>
</select>
我想说,“在名称为”xxx“的特定选择标记内搜索包含456的选项标记。
我这样做:
my $xp = XML::XPathEngine->new();
my $tree = HTML::TreeBuilder::XPath->new_from_content($mech->content);
my $search = $xp->find('//select[@name="xxx"]/option[.=~ /' . $re . '/]/@value', $tree);
($ re是选项部分的正则表达式。)
它在最后一行($ xp-&gt; find)返回的全部是
Can't locate object method "getRootNode" via package "HTML::TreeBuilder::XPath::Attribute" at /usr/lib/perl5/site_perl/5.8.8/XML/XPathEngine/NodeSet.pm line 90, <MYFILE> line 1.
这里有什么问题?那个模块有问题吗?我的XPath有问题吗?我应该使用其他“正常”的东西吗?
PS。我不使用XML :: Parser,因为它抱怨完全有效的页面
mismatched tag at line 9, column 3, byte 427 at /usr/lib/perl5/vendor_perl/5.8.8/i586-linux-thread-multi/XML/Parser.pm line 187
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>aaaa</title>
<link href="/x/include/main.css" type="text/css" rel="stylesheet">
<link href="/x/images/favicon.ico" rel="shortcut icon">
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
<script type="text/javascript" src="/x/include/layout.js"></script>
</head>
<body style=
.....
答案 0 :(得分:4)
嗯,您的示例HTML没有任何值属性,并且您没有提供完整的示例脚本。但是下面的脚本对我来说很好:
use XML::XPathEngine;
use HTML::TreeBuilder::XPath;
my $content = <<'';
<select name="xxx">
<option value=bla>123</option>
<option value=blubb>456</option>
</select>
my $re = '456';
my $xp = XML::XPathEngine->new();
my $tree = HTML::TreeBuilder::XPath->new_from_content($content);
my $search = $xp->find('//select[@name="xxx"]/option[.=~ /' . $re . '/]/@value', $tree);
print "$search\n";
猜测一下,你在$re
放了一些不起作用的东西。
我正在使用:
XML :: Parser不起作用的原因是HTML不是XML。