【问题标题】:Always getting first img instead of img after specified div id?在指定的 div id 之后总是得到第一个 img 而不是 img?
【发布时间】:2023-03-22 00:47:01
【问题描述】:

我正在创建一个基本的屏幕抓取工具,并且已经成功地完成了,但由于某种原因,这部分代码不会抓取预期的 img 标签。我试图在具有指定 id 的 div 之后抓取 img src,但脚本正在抓取页面上的第一个 img 标签。 例如,这个示例漫画刮刀

$agent->get("http://www.blondie.com/todays_strip/");
$stream = HTML::TokeParser->new(\$agent->{content});

$tag = $stream->get_tag("div");

while ($tag->[1]{id} and $tag->[1]{id} ne 'comicpanel') {
    $tag = $stream->get_tag("div");
}

my $blondie_comic = $stream->get_tag("img");

print $cgi->h1("$blondie_comic->[1]{'src'}");

上面的 sn-p 只是打印它遇到的第一个图像标签的 src,标志,而不是继续到漫画 img。

提前致谢。

【问题讨论】:

    标签: perl cgi screen-scraping


    【解决方案1】:

    我相信你需要

    while (not exists $tag->[1]{id} or $tag->[1]{id} ne '<specified-id>') {
      $tag = $stream->get_tag("div");
    }
    

    您想先检查 id 是否存在,然后再检查它是否不等于您指定的 id。你不能使用and,因为不存在的标签会是假的,会提前中断你的循环。

    这是我用来测试的文件。 id 为 1 是指定的 id:

    <div id='2'>
    <img src="NOPE" />
    </div>
    <div>
    <img src="NOPE - 2" />
    </div>
    <div id='1'>
    <img src="YEP" />
    </div>
    

    【讨论】:

    • 感谢@Nate...但由于某种原因仍然没有。我已经更新了我最初的问题,包括一个简单的刮擦,就像我描述的那样。
    • 好的。您能否发布您正在查看的数据的简化 HTML 示例?这可能有助于确定问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-29
    • 1970-01-01
    • 2017-06-14
    • 1970-01-01
    • 2022-01-05
    • 2023-04-05
    相关资源
    最近更新 更多