【问题标题】:Find links in Mojo that start with certain url在 Mojo 中查找以特定 url 开头的链接
【发布时间】:2018-07-15 00:31:44
【问题描述】:

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

【问题讨论】:

  • 您想知道哪个更高效吗?您实际上已经写出了方法 2 - 只需添加过滤器代码即可。
  • @ialarmedalien 是的。以及如何添加过滤代码?
  • 过滤代码类似于if ($link =~ /whatever/)

标签: perl mojolicious


【解决方案1】:

您可以使用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://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
    }
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-13
    • 2013-08-31
    • 2014-08-08
    • 2015-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-07
    相关资源
    最近更新 更多