【问题标题】:XPath Perl get attribute valueXPath Perl 获取属性值
【发布时间】:2010-08-13 07:00:12
【问题描述】:

我试图让 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->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=
.....

【问题讨论】:

  • 您完全有效的 HTML 不是格式良好的 XML:请注意 linkmeta 元素不为空。真正的 XPath 1.0 也是 //select[@name='xxx']/option[.='456'],没有 =~ 比较运算符。最后,您的输入样本甚至不是有效的 HTML...

标签: perl xpath attributes


【解决方案1】:

好吧,您的示例 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 中添加了一些不起作用的内容。

我正在使用:

  • HTML::TreeBuilder 3.23
  • HTML::TreeBuilder::XPath 0.08
  • XML::XPathEngine 0.08

XML::Parser 不起作用的原因是 HTML 不是 XML。

【讨论】:

  • 是的,您的示例有效。我不知道为什么我的没有。好的,我的示例中的选项标签搞砸了,但我的原件包含值属性。我现在已经完全切换到这部分的 RE,因为我需要解析的 HTML 无论如何都没有验证。感谢您的帮助。
猜你喜欢
  • 2016-04-22
  • 2017-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多