首页 > 解决方案 > 在 Mojo 中查找以特定 url 开头的链接

问题描述

我有 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($_);
    # ....

标签: perlmojolicious

解决方案


您可以使用css 选择器将搜索范围缩小到特定的 URL。特别是,您需要搜索具有属性href( a[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
    }
}

两种方法之间的效率不太可能有很大差异,而且您可能会花费更多时间对它们进行基准测试,而不是使用两者中的任何一个更快。


推荐阅读