2010-05-21 72 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方法,以方便查询文档。