[英]Grep and Extract Data in Perl
我將HTML內容存儲在變量中。 如何提取頁面中一組常用標簽之間的數據? 例如,我對數據感興趣(由DATA表示保持在一行標記之間,一行接一行:
...
<td class="jumlah">*DATA_1*</td>
<td class="ud"><a href="">*DATA_2*</a></td>
...
然后我想在散列中存儲映射DATA_2 => DATA_1
使用HTML解析模塊,如此Q -HTML :: TreeBuilder或HTML :: Parser的答案中所述。
從理論上講,你可以嘗試使用正則表達式來做到這一點,但正如鏈接問題的答案和無數次在SO上所述,使用RegEx解析HTML是一個帶有大寫字母的壞主意 - 太容易出錯,太難獲得好吧,不可能100%正確,因為HTML不是常規語言。
您可以嘗試這個模塊: HTML::TreeBuilder::XPath
。 醫生說:
此模塊將典型的XPath方法添加到HTML :: TreeBuilder,以便於查詢文檔。
因為它是HTML,你可能想要使用XPath模塊來處理HTML, HTML :: TreeBuilder :: XPath 。
首先,您需要使用HTML :: TreeBuilder方法解析字符串。 假設您的網頁內容位於名為$content
的變量中,請執行以下操作:
my $tree = HTML::TreeBuilder->new;
$tree->parse_file($file_name);
現在,您可以使用XPath表達式在您關注的節點上獲取迭代器。 第一個表達式獲取html
元素body
table
中tr
所有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";
}
有關其方法的更多信息,請參閱HTML :: TreeBuilder文檔;有關如何使用NodeSet結果對象的NodeSet文檔,請參閱。 w3schools 在這里有一個可通過的XPath教程。
有了這一切,你應該能夠進行相當強大的HTML解析來獲取你想要的任何元素。 您甚至可以在XPath查詢中指定類,ID等,以確定您想要的節點。 在我看來,使用這個修改過的XPath庫解析HTML比處理一堆一次性正則表達式要快得多,而且更易於維護。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.