在 Mojo 中查找以某些 url 开头的链接

Find links in Mojo that start with certain url

我有Mojo::DOM。

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

我想要以下两样东西之一:

1) 找到所有 开头的 "a" 标签,其中包含“/my_link”、“/my_link2”或“/my_link3

2) 找到所有 "a" 标签,遍历它们并检查 link 是否以“/my_link”、“/my_link2”或“ /my_link3

哪个更有效,如果它们之间有很大的区别。

我该怎么做?

我知道如何找到所有 links:

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

您可以使用 css selectors 将搜索范围缩小到特定网址。特别是,您需要搜索具有属性 href (a[href]) 的链接,其中 href 的值以特定字符串 (a[href^="..."]) 开头。要搜索多个不同的 URL,只需在 $dom->find('...').

中使用逗号分隔的选择器列表

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

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

for my $url ( $dom->find('a[href^="https://whosebug.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') =~ /(Whosebug|area51|codereview)/ ) {
       say $url->attr('href'); # or whatever
    }
}

这两种方法之间的效率不太可能有太大差异,而且您花在基准测试上的时间可能比使用这两种方法中更快的方法所获得的时间要多。