2010-08-13 75 views
1

我試圖讓XPath來返回屬性值標記的內容,也就是說,如果我有的XPath Perl中得到屬性值

<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); 

($重是選項部分的正則表達式。)

所有返回的最後一行($ 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解析器::因爲它抱怨一個完全有效的頁面

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會選擇[@ 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 ::解析器不起作用的是HTML不是XML。

+0

是的,你的例子的作品。我不知道我爲什麼不這樣做。好的選項標籤在我的例子中混亂了,但我的原始文件包含值屬性。 我現在已經完全切換到這個部分的RE,因爲我需要解析的HTML無論如何都沒有驗證。 感謝您的幫助。 – Marki 2010-08-13 13:31:25