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::DOM
とMojo::Collections
仕事を得ていません。
どんな助けでも大歓迎です。