You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Perl使用m//g无法提取网页数据,求代码修改指导

问题分析与解决方案

你的Perl代码没能提取到<span itemprop="name">里的内容,主要是因为正则表达式不够灵活,没法匹配HTML标签的各种格式变化,另外直接用正则解析HTML本身就容易踩坑。下面给你两种可行的解决办法:

方法1:修正正则表达式(快速临时方案)

HTML标签的格式往往不是固定的,比如属性之间可能有空格、换行,或者标签里还包含其他属性(比如class)。你原来的正则太死板,只能匹配完全符合<span itemprop="name">(.*?)</span>的标签,稍微有一点格式变化就匹配失败。

把正则改成下面这样,就能兼容更多情况:

my $maldet = "https://myanimelist.net/anime/35849/Darling_in_the_FranXX";
my $response = $ua->request(HTTP::Request->new(GET => $maldet));
my $rrs = $response->content;

# 修正后的正则
while ($rrs =~ m/<span[^>]*itemprop="name">(.*?)<\/span>/gis) {
    my $ANIME_NAME = $1;
    print item("ANIME NAME"), "$ANIME_NAME\n";
}

这里的关键改动:

  • [^>]*:匹配标签开头到itemprop之间的任意非>字符,允许标签内有其他属性或空格
  • gis修饰符:
    • g:全局匹配所有符合条件的标签
    • i:忽略HTML标签的大小写差异(虽然MyAnimeList的标签是小写,但加上更稳妥)
    • s:让.匹配换行符,避免标签内容跨换行时匹配失败

另外还要注意:有些网站会拦截没有合法User-Agent的请求,你可以给$ua设置一个浏览器标识,比如:

$ua->agent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36');

方法2:使用专业HTML解析模块(推荐长期方案)

用正则解析HTML本质上是不可靠的——HTML的结构随时可能变,标签嵌套、格式变化都会让正则失效。推荐用专门的HTML解析模块,比如Mojo::DOM或者HTML::TreeBuilder,它们能正确解析HTML结构,不用你手动写复杂的正则。

示例(用Mojo::DOM)

首先安装模块:

cpanm Mojolicious

然后修改代码:

use Mojo::UserAgent;

my $maldet = "https://myanimelist.net/anime/35849/Darling_in_the_FranXX";
my $ua = Mojo::UserAgent->new;
# 设置User-Agent避免被拦截
$ua->transactor->name('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36');

# 获取页面并解析DOM
my $dom = $ua->get($maldet)->res->dom;

# 提取所有itemprop="name"的span标签内容
$dom->find('span[itemprop="name"]')->each(sub {
    my $ANIME_NAME = $_->text;
    print item("ANIME NAME"), "$ANIME_NAME\n";
});

这种方法的优势:不管标签里有多少额外属性、结构怎么嵌套,只要itemprop="name"的span存在,就能准确提取内容,而且代码可读性更强,维护起来更方便。

内容的提问来源于stack exchange,提问作者Mobrine Hayde

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:22:31