2010-05-21 75 views
3

我有HTML內容存儲在一個變量。如何提取頁面中一組通用標籤之間的數據?例如,我對中的數據(由DATA表示保持一組標記,其中一個線後的其他之間:Grep和Perl中提取數據

... 
<td class="jumlah">*DATA_1*</td> 
<td class="ud"><a href="">*DATA_2*</a></td> 
... 

然後,我想用來存儲映射DATA_2 => DATA_1在哈希

回答

0

由於它是HTML,因此您可能需要使用用於處理HTML的XPath模塊HTML::TreeBuilder::XPath

首先,您需要使用HTML :: TreeBuilder方法解析字符串。假設你的網頁的內容是在一個名爲$content變量,像這樣做:

my $tree = HTML::TreeBuilder->new; 
$tree->parse_file($file_name); 

現在你可以使用XPath表達式得到了你所關心的節點迭代器。這首先表現得到有能力的trbody一個tablehtml元素中的所有td節點:

my $tdNodes = $tree->findnodes('/html/body/table/tr/td'); 

最後你可以遍歷所有節點在一個循環中找到你想要的東西:

foreach my $node ($tdNodes->get_nodelist) { 
    my $data = $node->findvalue('.'); // the content of the node 
    print "$data\n"; 
} 

有關如何使用NodeSet結果對象的方法和NodeSet文檔,請參閱HTML::TreeBuilder文檔。 w3schools有一個可以通過的XPath教程here

所有這一切,你應該能夠做出非常健壯的HTML解析來獲取你想要的任何元素。你甚至可以在你的XPath查詢中指定類,id和更多關於你想要的節點的具體細節。在我看來,使用這個修改後的XPath庫解析HTML比處理一堆一次性正則表達式要快很多並且更易於維護。

+0

+1代碼示例。 – 2010-05-21 23:53:24

2

既然是HTML我認爲這可能爲你工作?

https://metacpan.org/pod/XML::XPath

的XPath是這樣的。

+1

XPATH是否僅限於XML(僅限於XHTML)?我對它的使用經驗非常有限,但從未見過它用於處理非XHTML – DVK 2010-05-21 23:31:48

+0

@DVK:我不會把它放在Perl開發的XPath模塊之外,試圖變得更聰明一些。 – Axeman 2010-05-21 23:33:35

+0

@Axeman - touche :) – DVK 2010-05-21 23:34:50

0

使用HTML解析模塊,如答案to this Q - HTML :: TreeBuilder或HTML :: Parser中所述。

純粹理論上你可以嘗試使用正則表達式來做到這一點,但正如鏈接問題的答案和無數其他時間所指出的那樣,使用RegEx解析HTML是一個糟糕的想法 - 大寫字母很容易出錯,因爲HTML不是一種常規語言,所以很難變得好,並且不可能100%正確。

+0

這可能在理論上是不可能的 - HTML不是一種常規的語言。如果他的查詢是「常規」的話,那將是可能的。 – 2010-05-21 23:48:38

0

你可以試試這個模塊:HTML::TreeBuilder::XPath。該文檔說:

該模塊向HTML :: TreeBuilder添加了典型的XPath方法,以方便查詢文檔。