2010-08-13 15 views
1

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

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

Я хочу сказать, «поиск дополнительного тега ., содержащий 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); 

($ ре является регулярное выражение для опциональной части.)

Все возвращается на последней строке ($ XP-> найти) является

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

Ваш отлично действующий HTML не является хорошо сформированным XML: посмотрите, что элементы 'link' и' meta' не пусты. Также реальным XPath 1.0 будет '// select [@ name = 'xxx']/option [. = '456']', нет оператора сравнения '= ~'. И, наконец, ваш образец ввода не является допустимым HTML ... – 2010-08-13 21:18:16

ответ

2

Ну, ваш пример 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.

+0

Да, ваш пример работает. Я не знаю, почему мой нет. Ок, теги опций перепутаны в моем примере, но мой оригинал содержит атрибуты значений. Теперь я полностью переключился на REs для этой части, так как HTML, который мне нужен для анализа, в любом случае не подтвердил. Спасибо за помощь. – Marki

Смежные вопросы