gpt4 book ai didi

perl - 使用 Mojo::DOM 时无法精确定位子元素

转载 作者:行者123 更新时间:2023-12-05 01:13:34 25 4
gpt4 key购买 nike

我正在尝试使用 WWW::Mechanize 从旧的 vBulletin 论坛中提取文本和 Mojo::DOM .

vBulletin 不使用 HTML 和 CSS 进行语义标记,我在使用 Mojo::DOM->children 时遇到问题获取某些元素。

这些 vBulletin 帖子的结构因内容而异。

单条消息:

<div id="postid_12345">The quick brown fox jumps over the lazy dog.<div>

引用另一个用户的单个消息:
<div id="postid_12345">
<div>
<table>
<tr>
<td>
<div>Quote originally posted by Bob</div>
<div>Everyone knows the sky is blue.</div>
</td>
</tr>
</table>
</div>

I disagree with you, Bob. It's obviously green.
</div>

单条信息剧透:
<div id="postid_12345">
<div class="spoiler">Yoda is Luke's father!</div>
</div>

引用其他用户的单条消息,有剧透:
<div id="postid_12345">
<div>
<table>
<tr>
<td>
<div>Quote originally posted by Fred</div>
<div class="spoiler">Yoda is Luke's father!</div>
</td>
</tr>
</table>
</div>
<div class="spoiler">No waaaaay!</div>
</div>

假设上面的 HTML 和一个包含必要的帖子 ID 的数组:
for (@post_ids) {
$mech->get($full_url_of_specific_forum_post);
my $dom = Mojo::DOM->new($mech->content);
my $div_id = 'postid_' . $_;

say $dom->at($div_id)->children('div')->first;
say $dom->at($div_id)->text;
}

使用 $dom->at($div_id)->all_text给我所有的东西都是一条完整的线,这让我很难分辨文章中引用了什么和什么是原创。

使用 $dom->at($div_id)->text跳过所有子元素,因此不会选取引用的文本和剧透。

我尝试了 $dom->at($div_id)->children('div')->first 的变体,但这给了我一切,包括 HTML。

理想情况下,我希望能够获取每个帖子中的所有文本,每个子元素都在自己的行上,例如
 POSTID12345:
+ Quote originally posted by Bob
+ Everyone knows the sky is blue.
I disagree with you, Bob. It's obviously green.

我是 Mojo 的新手,对 Perl 很陌生。我想自己解决这个问题,但是在查看文档并摆弄了几个小时之后,我的大脑变得糊涂了,我不知所措。我只是不明白 Mojo::DOMMojo::Collections工作。

任何帮助将不胜感激。

最佳答案

查看Mojo::DOM的源码,基本上是 all_text method递归遍历 DOM 并提取所有文本。使用该源编写您自己的遍历 DOM 函数。它的递归函数取决于返回单个字符串,在您的递归函数中,您可能让它返回一个包含您需要的任何上下文的数组。

编辑:

经过对IRC的一些讨论,网络抓取示例已经更新,它可能会帮助您指导您。 http://mojolicio.us/perldoc/Mojolicious/Guides/Cookbook#Web_scraping

关于perl - 使用 Mojo::DOM 时无法精确定位子元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14073437/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com