2012-06-25 25 views
2

給定一個HTML類似以下內容:如何從文本摘錄的XPath路線

...more html above... 
<div class="any_name"> 
    <p>Element A goes here</p> 
    <p>Element B goes here</p> 
</div> 
...more html below... 

我需要得到一個包含(例如)任何元素的XPath的路線「A去」文本,並得到一些像:

/html/body/div[4]/div[2]/div/article/div/p 

注意,該結構可以是在每種情況下不同,我需要通過尋找每一次的文本整個文檔搜索...

其實我得到的網頁內容,但成功地運用一些L- ike this // element [text()=「A goes」] with Web :: Scraper似乎不起作用。

如何使用內容獲取此xpath路由?有任何想法嗎?謝謝!

+1

你可能想看到這個答案:http://stackoverflow.com/a/4747858/36305 –

回答

3

您可以使用XML::Twig來獲得。我改變了你提供的一些xpath,並使它更加模塊化。

use strict; use warnings; 
use feature 'say'; 
use XML::Twig; 
my $twig = XML::Twig->new(); 
$twig->parse(<<_HTML_ 
<html><body> 
<div class="any_name"> 
    <p>Element A goes here</p> 
    <p>Element B goes here</p> 
</div> 
</body></html> 
_HTML_ 
); 

for my $letter (qw(A B C)) { 
    foreach my $t ($twig->get_xpath("//p[string()=~/$letter goes/]")) { 
    say $t->xpath; 
    } 
} 

您可以在xpath中使用正則表達式來查找與您的字母匹配的元素。與text()=一個沒有在這種情況下工作,因爲XML::Twig匹配完整的文本,如果您使用=而不是=~ //。此外,正確的語法是string(),而不是text()

get_xpath方法返回元素列表。我在每個方法上使用了xpath方法,它將完整的xpath返回給元素。在我的情況是:

/html/body/div/p[1] 
/html/body/div/p[2] 

沒有匹配C因爲我沒有把它的HTML代碼。

+0

謝謝@simbabque,你解決了我的生活;) – Courier

+0

樂於幫助。 =) – simbabque