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
相关产品推荐
相关产品推荐

