我有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