XPath Perl получает значение атрибута - PullRequest
1 голос
/ 13 августа 2010

Я пытаюсь заставить XPath вернуть значение атрибута, но сначала искать содержимое тега, т. Е. Если у меня есть

<select name="xxx">
  <option=bla>123</option>
  <option=blubb>456</option>
</select>

Я хочу сказать, "поиск тега опции, содержащего 456 внутриопределенный тег выбора с именем "xxx".

Я делаю это:

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=
.....

1 Ответ

4 голосов
/ 13 августа 2010

Ну, ваш пример 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:: Парсер не работает, HTML не XML.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...