2010-09-10 35 views
2

我是Perl-HTML的新手。我试图从HTML表格中获取文本和链接。提取​​使用WWW ::机械化获取<a>的文本​​标签

下面是HTML结构:

<td>Td-Text 
    <br> 
    <a href="Link-I-Want" title="title-I-Want">A-Text</a> 
</td> 

我已经想通了,WWW::Mechanize是去取东西我从<a>部分需要最简单的模块,但我不知道怎么弄的来自<td>的文本。我希望这两项任务是背靠背进行的,因为我需要将每个单元的<td>-Text与其相应的<a>-Text配对到一个散列阵列中。

任何帮助将不胜感激!

Z.Zen

回答

5

WWW::Mechanize善于提取链接,但如果你需要得到其他文本,我通常将它与HTML::TreeBuilder结合。事情是这样的:

use HTML::TreeBuilder; 

my $tree = HTML::TreeBuilder->new_from_content($mech->content); 

foreach my $td ($tree->look_down(_tag => 'td')) { 

    # If there's no <a> in this <td>, then skip it: 
    my $a = $td->look_down(_tag => 'a') or next; 

    my $tdText = $td->as_text; 
    my $aText = $a->as_text; 

    printf("td-text: %s\n a-text: %s\nhref: %s\ntitle: %s\n", 
     $tdText, $aText, $a->attr('href'), $a->attr('title')); 
} 

这段代码的唯一的问题是,你不希望所有的<td>标签的文本。你如何解决这个问题取决于你。如果$aText足够独特的,你可以这样做:

$tdText =~ s/\Q$aText\E.*//s; 

在最坏的情况下,你必须编写自己的函数来提取所需的文本元素,在<br>停止(或无论你确定停止点)。

+0

除此之外,我可以推荐http://search.cpan.org/dist/HTML-TreeBuilder-LibXML/,它是HTML-TreeBuilder的扩展,也为程序员提供了XPath和LibXML的所有功能。我最近一直在使用它来测试HTML页面。 – 2010-09-11 13:12:32

0

我发现HTML :: TreeBuilder作为是解析HTML文件和拉动信息从他们的一个好方法。在这种情况下,像:

use HTML::TreeBuilder; 
my $page = get($URL); 
my $tree = HTML::TreeBuilder->new_from_content($page); 

foreach my $cell ($tree->look_down(_tag => "td")) { 
    my $links = $cell->extract_links(); 
    foreach my $link (@$links) { 
     print "href: ", $link->attr("href"), "; text: ", $link->as_text, "\n"; 
    } 
} 
$tree = $tree->delete; 

资源

+0

嗯...'extract_links'不像你认为的那样工作。返回值是arrayrefs的arrrayref,而不是元素的arrayref。 – cjm 2010-09-10 22:22:49