在Mojo中查找以特定网址开头的链接

时间:2018-07-14 14:59:11

标签: perl mojolicious

我有Mojo :: DOM。

  my $doc = Mojo::DOM->new(decode_utf8($html_page_content);

我想要两件事之一:

1)找到所有以 my_link”,“ / my_link2”或“ / my_link3”开始的“ a”标签

2)找到所有“ a”标记,对其进行迭代,然后检查链接是否以“ / my_link”,“ / my_link2”或“ / my_link3”开头

如果两者之间有很大差异,哪个更有效。

我该怎么做?

我知道如何找到所有链接:

  $doc->find('a')->each(sub {
    my $link = Mojo::URL->new($_);
    # ....

1 个答案:

答案 0 :(得分:2)

您可以使用css selectors将搜索范围缩小到特定的URL。特别是,您将要搜索属性为hrefa[href])的链接,其中href的值以某个字符串(a[href^="..."])开头。要搜索多个不同的URL,只需在$dom->find('...')中使用逗号分隔的选择器列表即可。

这里是一个示例,该示例提取以三个不同的字符串开头的链接(我使用了此网页中的URL)。您可以根据自己的情况进行调整:

my $dom = Mojo::DOM->new($page);

for my $url ( $dom->find('a[href^="https://stackoverflow.com"], a[href^="https://stackexchange.com"], a[href^="https://area51"]')->each ) {
    say $url->attr('href'); # or do whatever you want to here
}

如果您想使用建议的方法(2),获取所有链接并自己过滤它们,可以这样做:

for my $url ( $dom->find('a[href^="https://"]')->each ) {

    # substitute in your own regex here
    if ( $url->attr('href') =~ /(stackoverflow|area51|codereview)/ ) {
       say $url->attr('href'); # or whatever
    }
}

这两种方法的效率差异不太可能,并且基准测试的时间可能比使用两种方法中任何一种更快的时间所花费的时间都要多。