perl - 在 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($_);
# ....
解决方案
您可以使用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
}
}
两种方法之间的效率不太可能有很大差异,而且您可能会花费更多时间对它们进行基准测试,而不是使用两者中的任何一个更快。
推荐阅读
- woocommerce - 使用 For FormData 格式将订单详细信息 WooCommerce 发送到外部 API
- javascript - 通过php ul列表循环中的单击事件添加和删除标签的类
- javascript - 引导表单验证不适用于 ajax
- python - 消费者 Kafka 通过 Rest Proxy 和 python
- swift - 如何让 swiftui 等到元素完成退出转换,然后再更新它所在的列表?
- flutter - 颤振 Mockito。模拟失败
- php - PHP 代码不工作,从 POST 作为 XML 接收数据,
- amazon-web-services - AWS Athena Drop View 中文命名
- python - 给定表替换子字符串的最佳方法
- reactjs - 在 next.js 中访问 localStorage