2013-02-06 19 views
3

遇到麻煩試圖輸出匹配節點的內容是我解析:Perl的HTML ::元素 - 傾銷只是後人的HTML

<div class="description">some text <br/>more text<br/></div> 

我使用HTML::TreeBuilder::XPath找到節點(只有一個div使用該班):

my $description = $tree->findnodes('//div[@class="description"]')->[0]; 

它發現節點(返回爲HTML::Element我相信),但$description->as_HTML包括元素本身太 - 我只想包含在元素中的HTML一切:

some text <br/>more text<br/> 

我明顯可以正則表達式剝離出來,但感覺凌亂,我敢肯定我只是缺少一個函數的地方去做?

回答

0

嘗試這樣做:

my $description = $tree->findnodes('//div[@class="description"]/text()')->[0]; 

這是一個Xpath的伎倆。

+0

返回類型爲HTML的一個目的:: TreeBuilder作爲:: XPath的:: TextNode不具備「as_HMTL」的方法(和我似乎無法找到任何文檔,以什麼它確實提供) – AndyC

0

使用./node()來獲取包括文本和元素的所有子節點。

my $description = $tree->findnodes('//div[@class="description"]/node()'); 
+0

它具有與使用text()相同的問題,返回的對象是HTML :: TreeBuilder :: XPath :: TextNode,我不知道該如何處理它。 – AndyC

+0

這個調用將返回*多個*節點(包含的所有節點),所以它應該是一個包含所有元素的容器。它會以標量模式返回一些列表或一個Tree :: XPathEngine :: NodeSet對象(你迫使它)。您可能需要以某種方式迭代結果。哦,最後看一下' - > [0]',我想這可能是錯誤的(因爲你需要所有節點,而不是第一個節點)。我從我的答案中刪除了它。 –

+0

是的,看着列表返回它的'HTML :: TreeBuilder :: XPath :: TextNode'和'HTML :: Element',它們是列表本身的混合。它會非常煩躁和煩人,只是爲了完成我想要的,所以按照這個速度,我可能只是用正則表達式去掉父標記! – AndyC