我有HTML內容存儲在一個變量。如何提取頁面中一組通用標籤之間的數據?例如,我對中的數據(由DATA表示保持一組標記,其中一個線後的其他之間:Grep和Perl中提取數據
...
<td class="jumlah">*DATA_1*</td>
<td class="ud"><a href="">*DATA_2*</a></td>
...
然後,我想用來存儲映射DATA_2 => DATA_1在哈希
我有HTML內容存儲在一個變量。如何提取頁面中一組通用標籤之間的數據?例如,我對中的數據(由DATA表示保持一組標記,其中一個線後的其他之間:Grep和Perl中提取數據
...
<td class="jumlah">*DATA_1*</td>
<td class="ud"><a href="">*DATA_2*</a></td>
...
然後,我想用來存儲映射DATA_2 => DATA_1在哈希
由於它是HTML,因此您可能需要使用用於處理HTML的XPath模塊HTML::TreeBuilder::XPath。
首先,您需要使用HTML :: TreeBuilder方法解析字符串。假設你的網頁的內容是在一個名爲$content
變量,像這樣做:
my $tree = HTML::TreeBuilder->new;
$tree->parse_file($file_name);
現在你可以使用XPath表達式得到了你所關心的節點迭代器。這首先表現得到有能力的tr
在body
一個table
在html
元素中的所有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比處理一堆一次性正則表達式要快很多並且更易於維護。
使用HTML解析模塊,如答案to this Q - HTML :: TreeBuilder或HTML :: Parser中所述。
純粹理論上你可以嘗試使用正則表達式來做到這一點,但正如鏈接問題的答案和無數其他時間所指出的那樣,使用RegEx解析HTML是一個糟糕的想法 - 大寫字母很容易出錯,因爲HTML不是一種常規語言,所以很難變得好,並且不可能100%正確。
這可能在理論上是不可能的 - HTML不是一種常規的語言。如果他的查詢是「常規」的話,那將是可能的。 – 2010-05-21 23:48:38
你可以試試這個模塊:HTML::TreeBuilder::XPath
。該文檔說:
該模塊向HTML :: TreeBuilder添加了典型的XPath方法,以方便查詢文檔。
+1代碼示例。 – 2010-05-21 23:53:24