【发布时间】:2012-12-13 22:48:57
【问题描述】:
我正在尝试使用 WWW::Mechanize 和 Mojo::DOM 从旧的 vBulletin 论坛中提取文本。
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::DOM 和Mojo::Collections 是如何工作的。
任何帮助将不胜感激。
【问题讨论】:
标签: perl mojolicious