xpathで切り取りできないかなぁ
以前紹介した記事
ここでは記事を取ってくる際Xpath指定で色々取り込むことが可能でした。
PlaggerでもBodyなどの取得にxpathが使えるのですが、不必要な部分のそぎ落としは私が見る限り正規表現でカットしていました。
wallabagのようにstripコマンドがあったら便利だなぁと思いEntryFullTextに機能を追加してみました。
私のはもはや別物
実は色々と機能を拡張しすぎてもはやEntryFullTextではなくなっていますので追加点だけご説明します。
find /usr -name EntryFullText.pm sudo vi /usr/local/share/perl/5.24.1/Plagger/Plugin/Filter/EntryFullText.pm
この最初の方でXML::LibXMLを呼び出せるようuseで他を呼び出している部分に以下を追加します。
use XML::LibXML;
そしてsub extract サブルーチンの下に以下のサブルーチンを追加します。
sub strip_xpath {
my($body, $args) = @_;
my $parser = XML::LibXML->new;
$parser->keep_blanks(0);
my $dom = $parser->parse_string($body);
$dom->setEncoding("UTF-8");
foreach my $element ( $dom->findnodes("$args")) {
$element->parentNode->removeChild($element);
}
return $dom->toString(1);
}
これを追加することによりアセットにて以下の構文が使えるようになります。
extract_after_hook: |
$data->{body} = strip_xpath( $data->{body} , '//div[@class="sns print_none"]' );
という感じで削りたい部分がxpathで指定できるようになります。
記事途中のsnsの部分など取り除きたい部分を指定してあげればごっそり削ってくれます。
当然正規表現でもカットできますから最後のコメント部分などはバッサリカットなんてこともできます。
注意点としてはyaml上方でBodyをXpathなどで取り込んでくるのでXpath位置がページ全体から検索するようなやり方ではマッチしません。
例えばBodyをXpathで取り込んだ後の形で
<div class="a">
<div class="b">
<div class="c">
<img src="aaa.jpg"/>
</div>
<img src="bbb.jpg"/>テスト
</div>
</div>
として取り込んだ後は/html/から始まっていませんのでclass=”c”を指定する場合は
$data->{body} = strip_xpath( $data->{body} , '//div[@class="c"]' );
としなければなりません。ご注意を。
スクレイピングって楽しい
本当はソースすべてをお見せしたいのですが、色々と弄りすぎてるのでお出しできません。作者様に迷惑かかりますので。
でもスクレイピングでstripができるとバッサリカットしたりできてすっきりしますよ。
よいPlaggerライフを!


コメント