Perl 使用Web::Scraper刮取表#id列

Perl 使用Web::Scraper刮取表#id列,perl,Perl,有一个html页面,具有以下结构: 有一个带有id=“searchResult” 多行 每个包含3个td-无任何类 在每个表中,单元格包含一个URL,我需要第二个单元格(列)中的URL 尝试了不同的XPATH刮刀,如: my $links = scraper { process '//table[id="searchResult"]', "lines[]" => scraper { process "//tr/td[2]/a", text => 'TEXT

有一个html页面,具有以下结构:

  • 有一个带有
    id=“searchResult”
  • 多行
  • 每个包含3个
    td
    -无任何类
  • 在每个表中,单元格包含一个URL,我需要第二个单元格(列)中的URL
尝试了不同的XPATH刮刀,如:

my $links = scraper {
    process '//table[id="searchResult"]', "lines[]" => scraper {
        process "//tr/td[2]/a", text => 'TEXT';
        process "//tr/td[2]/a", link => '@href';
    };
};
my $res = $links->scrape($html);
但是不起作用,$res是空的
{}

如果有人需要,以下是完整的测试代码:

use 5.014;
use warnings;

use Web::Scraper;
use Data::Dumper;

my $links = scraper {
    process '//table[id="searchResult"]', "lines[]" => scraper {
        process "//tr/td[2]/a", text => 'TEXT';
        process "//tr/td[2]/a", link => '@href';
    };
};

my $html = do {local $/;<DATA>};
#say $html;

my $res = $links->scrape($html);
say Dumper $res;

__DATA__
<html>
<body>
<p>...</p>
<table id="searchResult">
    <thead><th>x</th><th>x</th><th>x</th><th>x</th><th>x</th></thead>
    <tr>
    <td><a href="#11">cell11</a></td>
    <td><a href="#12">cell12</a></td>
    <td><a href="#13">cell13</a></td>
    </tr>
    <tr>
    <td><a href="#21">cell21</a></td>
    <td><a href="#22">cell22</a></td>
    <td><a href="#23">cell23</a></td>
    </tr>
    <tr>
    <td><a href="#31">cell31</a></td>
    <td><a href="#32">cell32</a></td>
    <td><a href="#33">cell33</a></td>
    </tr>
</table>
</body>
</html>
使用5.014;
使用警告;
使用Web::Scraper;
使用数据::转储程序;
我的$links=scraper{
进程“//表[id=“searchResult”],“行[]”=>{
进程“//tr/td[2]/a”,text=>“text”;
进程“//tr/td[2]/a”,链接=>'@href';
};
};
my$html=do{local$/;};
#比如说$html;
my$res=$links->scrape($html);
比如Dumper$res;
__资料__

xxxxx
对于此类项目,我首选的刮板是。有关8分钟的介绍视频,请查看

您也可以使用指向一个对象的指针

下面将执行您试图使用此模块进行的分析:

use strict;
use warnings;

use Mojo::DOM;

my $dom = Mojo::DOM->new(do {local $/; <DATA>});

for my $link ($dom->find('table[id=searchResult] > tr > td:nth-child(2) > a')->each) {
    print $link->{href}, " - ", $link->text, "\n";
}

__DATA__
<html>
<body>
<p>...</p>
<table id="searchResult">
    <thead><th>x</th><th>x</th><th>x</th><th>x</th><th>x</th></thead>
    <tr>
    <td><a href="#11">cell11</a></td>
    <td><a href="#12">cell12</a></td>
    <td><a href="#13">cell13</a></td>
    </tr>
    <tr>
    <td><a href="#21">cell21</a></td>
    <td><a href="#22">cell22</a></td>
    <td><a href="#23">cell23</a></td>
    </tr>
    <tr>
    <td><a href="#31">cell31</a></td>
    <td><a href="#32">cell32</a></td>
    <td><a href="#33">cell33</a></td>
    </tr>
</table>
</body>
</html>

我想知道我的XPath定义中有什么错误,但了解Mojo::Dom也很好。如果没有人回答我的问题,我会接受这个+谢谢。Mojo::DOM真是太棒了——非常容易使用。扔掉Web::Scraper(现在)并接受它。再次感谢你
#12 - cell12
#22 - cell22
#32 - cell32